Property accessors
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Property Accessors ermöglichen den Zugriff auf die Eigenschaften eines Objekts durch die Punktnotation oder die Klammernotation.
Probieren Sie es aus
const person1 = {};
person1["firstName"] = "Mario";
person1["lastName"] = "Rossi";
console.log(person1.firstName);
// Expected output: "Mario"
const person2 = {
firstName: "John",
lastName: "Doe",
};
console.log(person2["lastName"]);
// Expected output: "Doe"
Syntax
object.propertyName
object[expression]
object.#privateProperty
Beschreibung
Man kann sich ein Objekt als ein assoziatives Array (auch bekannt als Map, Dictionary, Hash, Nachschlagetabelle) vorstellen. Die Schlüssel in diesem Array sind die Namen der Eigenschaften des Objekts.
Es gibt zwei Möglichkeiten, auf Eigenschaften zuzugreifen: Punktnotation und Klammernotation.
Punktnotation
Im object.propertyName
-Syntax muss propertyName
ein gültiger JavaScript-Bezeichner sein, der auch ein reserviertes Wort sein kann. Zum Beispiel ist object.$1
gültig, während object.1
es nicht ist.
const variable = object.propertyName;
object.propertyName = value;
const object = {};
object.$1 = "foo";
console.log(object.$1); // 'foo'
const object = {};
object.1 = "bar"; // SyntaxError
console.log(object.1); // SyntaxError
Hier wird die Methode mit dem Namen createElement
aus document
abgerufen und aufgerufen.
document.createElement("pre");
Wenn Sie eine Methode für ein numerisches Literal verwenden, und das numerische Literal keinen Exponenten und keinen Dezimalpunkt hat, sollten Sie Leerzeichen vor dem Punkt lassen, der dem Methodenaufruf vorangeht, damit der Punkt nicht als Dezimalpunkt interpretiert wird.
77 .toExponential();
// or
77
.toExponential();
// or
(77).toExponential();
// or
77..toExponential();
// or
77.0.toExponential();
// because 77. === 77.0, no ambiguity
Darüber hinaus können private Eigenschaften nur mit der Punktnotation innerhalb der Klasse, die sie definiert, zugegriffen werden.
Klammernotation
Im object[expression]
-Syntax sollte expression
zu einem String oder Symbol auswerten, der den Namen der Eigenschaft repräsentiert. Daher kann es sich beispielsweise um jeden beliebigen String-Literal handeln, einschließlich '1foo'
, '!bar!'
oder sogar ' '
(ein Leerzeichen).
const variable = object[propertyName];
object[propertyName] = value;
Dies tut genau dasselbe wie das vorherige Beispiel.
document["createElement"]("pre");
Ein Leerzeichen vor der Klammernotation ist zulässig.
document ["createElement"]("pre");
Das Übergeben von Ausdrücken, die sich zum Eigenschaftsnamen auswerten, erzielt dasselbe Ergebnis wie das direkte Übergeben des Eigenschaftsnamens.
const key = "name";
const getKey = () => "name";
const Obj = { name: "Michel" };
Obj["name"]; // returns "Michel"
Obj[key]; // evaluates to Obj["name"], and returns "Michel"
Obj[getKey()]; // evaluates to Obj["name"], and returns "Michel"
Achten Sie jedoch darauf, beim Zugriff auf Eigenschaften, deren Namen durch externe Eingaben bestimmt werden, eckige Klammern zu verwenden. Dies kann Ihren Code anfällig für Objektinjektionsangriffe machen.
Eigenschaftsnamen
Jeder Eigenschaftsname ist ein String oder ein Symbol. Jeder andere Wert, einschließlich einer Zahl, wird in einen String umgewandelt. Dies gibt 'value'
aus, da 1
in '1'
umgewandelt wird.
const object = {};
object["1"] = "value";
console.log(object[1]);
Dies gibt ebenfalls 'value'
aus, da sowohl foo
als auch bar
in denselben String ("[object Object]"
) umgewandelt werden.
const foo = { uniqueProp: 1 };
const bar = { uniqueProp: 2 };
const object = {};
object[foo] = "value";
console.log(object[bar]);
Methodenbindung
Es ist typisch, bei der Diskussion von Objekteigenschaften zwischen Eigenschaften und Methoden zu unterscheiden. Diese Unterscheidung ist jedoch kaum mehr als eine Konvention. Eine Methode ist eine Eigenschaft, die aufgerufen werden kann (zum Beispiel, wenn sie einen Verweis auf eine Function
-Instanz als Wert hat).
Eine Methode ist nicht an das Objekt gebunden, dem sie als Eigenschaft gehört. Speziell ist this
in einer Methode nicht festgelegt und bezieht sich nicht notwendigerweise auf das Objekt, das die Methode enthält. Stattdessen wird this
durch den Funktionsaufruf "übergeben". Siehe die Referenz für this
.
Beispiele
Klammernotation vs. eval()
JavaScript-Anfänger machen oft den Fehler, eval()
zu verwenden, wo stattdessen die Klammernotation verwendet werden kann.
Zum Beispiel wird die folgende Syntax oft in vielen Skripten gesehen.
const x = eval(`document.forms.form_name.elements.${strFormControl}.value`);
eval()
ist langsam und sollte, wenn möglich, vermieden werden. Auch strFormControl
müsste einen Bezeichner enthalten, was für Namen und id
s von Formularelementen nicht erforderlich ist. Es ist besser, stattdessen die Klammernotation zu verwenden:
const x = document.forms.form_name.elements[strFormControl].value;
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-property-accessors |