| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Errors/Get_set_missing_private | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Der JavaScript-Fehler "kann nicht auf privates Feld oder Methode zugreifen: Objekt ist nicht die richtige Klasse" oder "kann privates Feld nicht setzen: Objekt ist nicht die richtige Klasse" tritt auf, wenn ein privates Feld oder eine Methode bei einem Objekt abgefragt oder gesetzt wird, das dieses private Element nicht definiert hat.
TypeError: Cannot read private member #x from an object whose class did not declare it (V8-based) TypeError: Cannot write private member #x to an object whose class did not declare it (V8-based) TypeError: can't access private field or method: object is not the right class (Firefox) TypeError: can't set private field: object is not the right class (Firefox) TypeError: Cannot access invalid private field (evaluating 'this.#x') (Safari)
TypeError
Sie versuchen, auf ein privates Feld oder eine Methode bei einem Objekt zuzugreifen oder es zu setzen, aber dieses Objekt enthlt nicht dieses private Element. Private Instanzeigenschaften knnen nur bei Instanzen der Klasse (einschlielich ihrer Unterklassen) zugegriffen werden, die sie deklariert; private statische Eigenschaften knnen nur bei der Klasse selbst zugegriffen werden, die sie deklariert, und nicht bei Unterklassen.
Dieser Fehler tritt auf, wenn der private Name im Klassenbereich existiert, aber das Objekt, bei dem darauf zugegriffen wird, ungltig ist. Wenn der private Name nicht existiert, erhalten Sie stattdessen einen Syntaxfehler.
Sie haben das Feld mglicherweise als statisches Feld deklariert, versuchen aber darauf bei einer Instanz zuzugreifen, oder umgekehrt.
class MyClass {
static #x = 0;
doSomething() {
console.log(this.#x);
}
}
const obj = new MyClass();
obj.doSomething();
// TypeError: can't access private field: object is not the right class
Um dies zu beheben, ndern Sie das Feld entweder in ein Instanzfeld, greifen Sie auf das Feld bei der Klasse selbst zu oder deklarieren Sie ein anderes Feld bei der Instanz. Beachten Sie, dass der private Namensraum zwischen statischen und Instanzeigenschaften geteilt wird, sodass Sie kein statisches und instanzenbasiertes privates Element mit demselben Namen haben knnen.
class MyClass {
#x = 0;
doSomething() {
console.log(this.#x);
}
}
class MyClass2 {
static #x = 0;
doSomething() {
console.log(MyClass2.#x);
}
}
Vielleicht haben Sie eine Methode, die auf this.#x zugreift, jedoch mit einem anderen this-Wert aufgerufen wird.
class JSONReplacer {
#count = 0;
func(key, value) {
if (typeof value === "object") {
this.#count++;
}
return value;
}
}
JSON.stringify({ a: 1, b: { c: 2 } }, new JSONReplacer().func);
// TypeError: can't access private field: object is not the right class
Dies liegt daran, dass JSON.stringify() die Ersetzungsfunktion mit dem Objekt aufruft, das value enthlt, als this, sodass das private Feld nicht zugnglich ist. Um dies zu beheben, knnen Sie die Methode an das Objekt binden oder eine Pfeilfunktion verwenden, um sicherzustellen, dass replacer.func mit dem korrekten this-Wert aufgerufen wird.
const replacer = new JSONReplacer();
JSON.stringify({ a: 1, b: { c: 2 } }, replacer.func.bind(replacer));
JSON.stringify({ a: 1, b: { c: 2 } }, (...args) => replacer.func(...args));
Meistens, wenn Sie versehentlich eine Methode ungebunden haben, wrde die Methode mit undefined als this aufgerufen, was zu einem anderen Fehler fhren wrde (TypeError: kann undefined nicht in Objekt konvertieren). Dieser Fehler tritt nur auf, wenn die Methode mit einem anderen Objekt als this aufgerufen wird, entweder durch die Verwendung von call() oder apply(), oder durch bergabe der Methode als Rckruffunktion an eine Funktion, die sie mit einem anderen this-Wert aufruft.
Wenn Sie nicht sicher sind, ob das Objekt das private Element enthalten wird, wie im folgenden Code:
class MyClass {
#x = 0;
static doSomething(obj) {
console.log(obj.#x); // Throws if obj is not an instance of MyClass
}
}
Knnen Sie den in Operator verwenden, um zuerst eine gebrandete berprfung durchzufhren.
class MyClass {
#x = 0;
static doSomething(obj) {
if (!(#x in obj)) {
return;
}
console.log(obj.#x);
}
}
Wenn Sie eine private statische Eigenschaft haben, knnen Sie nur bei der Klasse, die sie deklariert, darauf zugreifen, nicht bei Unterklassen.
class MyClass {
static #x = 0;
doSomething() {
console.log(this.#x);
}
}
class MySubClass extends MyClass {}
MySubClass.doSomething();
// TypeError: can't access private field: object is not the right class
Um dies zu beheben, greifen Sie niemals ber this auf private statische Eigenschaften zu. Stattdessen geben Sie immer explizit den Namen der Klasse an.
class MyClass {
static #x = 0;
doSomething() {
console.log(MyClass.#x);
}
}
Im Gegensatz zu normalen String- oder Symbol-Eigenschaften werden private Namen nicht zwischen Klassen geteilt. Wenn Sie ein privates Element mit demselben Namen in zwei Klassen haben, sind sie dennoch nicht dasselbe Element, und Sie knnen nicht auf das private Element einer Klasse von einer anderen Klasse zugreifen.
class MyClass {
#x = 0;
}
class MyOtherClass {
#x = 1;
doSomething(o) {
console.log(o.#x);
}
}
const obj = new MyClass();
new MyOtherClass().doSomething(obj);
// TypeError: can't access private field: object is not the right class
Sie knnen nicht dynamisch private Elemente zu nicht verwandten Objekten hinzufgen.
class MyClass {
#x = 0;
static stamp(obj) {
obj.#x = 1;
}
}
MyClass.stamp({});
// TypeError: can't set private field: object is not the right class
Wenn Sie dies wirklich tun mchten, ziehen Sie den Rckberschreibungstrick in Betracht. Im Allgemeinen mchten Sie jedoch wahrscheinlich eher einen WeakMap verwenden.
class MyClass {
static #objToX = new WeakMap();
static stamp(obj) {
MyClass.#objToX.set(obj, 1);
}
}
MyClass.stamp({});
Der Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |