2017-11-04 3 views
1

Wie wir wissen, wenn wir versuchen, auf die Eigenschaft eines Objekts zuzugreifen, prüft es zuerst, ob das Objekt eine eigene Eigenschaft hat. Wenn es nicht findet, durchläuft es den Prototyp und überprüft, und so weiter die Prototyp-Kette.In allen Fällen, in denen ein Objekt seine Prototypkette nicht durchläuft, um einen Wert zu erhalten?

auf die Frage kommen, bitte den unten stehenden Code-Schnipsel (http://jsbin.com/mabajidoti/edit?js,console)

function CT() {} 
CT.prototype.myValue = 4; 
var myObj = Object.create(CT); 

console.log(myObj.myValue);   //logs undefined 
console.log(myObj.prototype.myValue) //logs 4 

Aus dem obigen Schnipsel, die ersten console.log Anweisung überprüfen, kehrt myObj.myValue undefined obwohl myValue in seiner Verfügung Prototyp (2. console.log-Anweisung)? Sollte es nicht die Prototypkette durchlaufen haben, um den Wert von myValue zu erhalten?

+0

'CT.prototype' als Prototyp verwendet wird von neuen Instanzen von 'CT'. 'Object.create (CT);' erstellt ein neues Objekt mit 'CT' selbst als Prototyp. Wenn Sie möchten, dass "CT.prototype" der Prototyp ist, müssen Sie 'Object.create (CT.prototype)' aufrufen. –

+0

* "Irgendwelche Fälle, in denen ein Objekt seine Prototypkette nicht durchläuft, um einen Wert zu erhalten?" * Nein. –

Antwort

2

Sie scheinen Object.create() mit dem Aufrufen einer Konstruktorfunktion über die new operator verwechselt zu haben.

Wenn Sie hat gesagt:

var myObj = new CT(); 

dann Ihre myObj würde die CT.prototype und myObj.myValue würde 4 sein damit verknüpft werden. Wenn Sie Object.create(CT) verwenden, haben Sie ein neues Objekt erstellt, dessen Prototyp die Funktion ist. So ist CT.prototypenicht Teil der Prototyp-Kette Ihres neuen Objekts. Beachten Sie, dass CT.prototype nicht in der Prototypkette von CT ist, sondern das Objekt angibt, das der Prototyp für Objekte ist, die mit new CT() erstellt wurden.

Eine korrekte Verwendung von Object.create() Zugang zu einer myValue Eigenschaft aus dem Prototyp wäre zu ermöglichen:

var CT = { 
 
    myValue : 4 
 
}; 
 
var myObj = Object.create(CT); 
 
console.log(myObj.myValue);   //logs 4

Oder mit Ihrer vorhandenen CT() Funktion und CT.prototype, man könnte sagen:

myObj = Object.create(CT.prototype); 
0

Prototyp ist ins tance Variablen können Sie Prototyp mit obj.prototypeName zugreifen, wenn Sie obj erstellen mit new Obj()

zuerst sehen Array

Array.forEach 
// undefined 

Array.prototype.forEach 
// ƒ forEach() { [native code] } 

new Array().forEach 
// ƒ forEach() { [native code] } 

[].forEach 
// ƒ forEach() { [native code] } 

Ihre CT-Klasse

function CT() {} 
CT.prototype.myValue = 4; 
var ct1 = new CT(); 
var ct2 = new CT(); 

ct1.myValue = 100; 

console.log(ct1.myValue); //logs 100 
console.log(ct2.myValue); //logs 4 
Verwandte Themen