2017-09-27 3 views
0

Ich versuche, JS ES6-Klassen zu verstehen, und mein Problem wird "Maximale Call-Stack-Größe überschritten", wenn ich auf "this" stehe. Variablen. Schauen wir uns dieses Beispiel an:ES6 JS Klassen-Unterstreichungssatz und Methoden abrufen "Maximale Call-Stack-Größe überschritten"

class Human { 
    constructor(age) { 
    this.age = age; 
    // "this._age = age;" output: 
    // Property age of instance without underscore: 34 
    // Property age of instance with underscore: 34 
    } 

    get age() { 
    return this._age; 
    // Without underscore error: "Uncaught RangeError: Maximum call stack size exceeded" 
    } 

    set age(age) { 
    this._age = age; 
    // Without underscore error: "Uncaught RangeError: Maximum call stack size exceeded" 
    console.log(`Without underscore: ${this.age}`); 
    console.log(`With underscore: ${this._age}`); 
    } 
} 

let john = new Human(34); 
console.log(`Property age of instance without underscore: ${john.age}`); 
console.log(`Property age of instance with underscore: ${john._age}`); 

Warum muss ich diesen Unterstrich in get und set Methoden verwenden? Warum ändern sich Ausgaben so, wenn ich sie im Konstruktor verwende? Warum gibt es keinen Metter? Ich benutze Unterstriche oder nicht, wenn ich mich auf Instanzeigenschaften beziehe? In der MDN-Dokumentation gibt es überhaupt keine Unterstreichung.

Antwort

4

Der ganze Sinn der Verwendung von set age ist, dass Sie einen Setter namens age definieren.

Wenn die Implementierung Ihres Setter nur this.age = <new value> tut, dann sind Sie rekursiv Aufruf der Setter.

Sie können nicht beide einen Setter namens age haben und versuchen, eine Elementvariable namens age zu setzen. Sie müssen verschiedene Dinge genannt werden, wie age und _age.

0

Dies ist zu lang für einen Kommentar. So fügen Sie Antwort auf Meagar die (richtige):

set foo (val) { 
    // empty 
} 

Ist Zucker über diese:

instance.foo = val; 

So ein anderer Code jedes Mal setzt die foo Eigenschaft Ihre Setter aufgerufen wird. Der Grund Setter vorhanden ist, wenn Sie etwas anderes tun möchten, wie eine Überprüfung ausführen, um zu sehen, ob der Wert gültig ist. Also, wenn Sie die Setter haben, und es wird aufgerufen, wenn Sie tun

instance.foo = val; 

Dann in der Setter haben Sie

set foo (val) { 
    this.foo = val; 
} 

es tatsächlich selbst aufruft.

Verwandte Themen