2013-07-20 11 views

Antwort

12

Von MDN:

Object.getPrototypeOf() ist die Standardimplementierung des alten und veralteten Objekt .__ proto__ Eigenschaft. Es ist jedoch eine schreibgeschützte Methode.

Also im Grunde führen sie die gleiche Sache, wenn Sie den Wert lesen, außer __proto__ ist nicht-Standard. __proto__ können Sie möglicherweise auch den Prototyp eines vorhandenen Objekts festlegen, aber im Allgemeinen ist das keine gute Idee, so dass der Standard nun eine Konstruktorfunktion oder Object.create verwenden würde, um ein Objekt mit einem bestimmten Prototyp zu erstellen. Das heißt, die ES6-Spezifikation definiert auch eine setPrototypeOf für das Festlegen des Prototyps eines Objekts, obwohl es aus Leistungsgründen am besten ist, das zu vermeiden, wenn es nicht explizit erforderlich ist.

6

Ursprünglich war __proto__ ein Mozilla-Only-Hack in frühen Versionen von Mozilla-Browsern (Firefox vor 3.5). Es wurde in der ECMAScript 3.1 nur im Jahr 2008 kodifiziert.

Ein Unterschied ist, dass __proto__ geändert werden kann (eine schlechte Design-Praxis obwohl), während getPrototypeOf eine Lesefunktion ist.

var parentObject = {"parentKey" : "parentValue"}; 
var childObject = {"childKey" : "childValue"}; 
childObject.__proto__ = parentObject; 
console.log(childObject.parentKey); // parentValue 
Object.getPrototypeOf(childObject) = {"parentKey" : "newValue"}; 
// ReferenceError: Invalid left-hand side in assignment 

Ein weiterer Unterschied ist, wie sie den unwahrscheinlichen Fall eines Namenskonflikt behandeln:

var myObject = { __proto__ : "conflicts", getPrototypeOf : function() {return "does not conflict"} }; 
console.log(myObject.getPrototypeOf()); // "does not conflict" 
// all objects inherit from Object.prototype, not Object, so there is no conflict 
console.log(Object.getPrototypeOf(myObject)) // Object {} 
console.log(myObject.__proto__); // Object {}, the value "conflicts" is lost 
+0

Danke für den Hinweis auf den Namen Konflikt, gut zu wissen. – simonzack

0

Proxy behandelt <__proto__> als get:

_ = new Proxy({}, { 
    get:z=>console.log('a'), 
    getPrototypeOf:z=>console.log('b'), 
}); 
_.__proto__/*a*/ 

— und <getPrototypeOf> als a :

_ = new Proxy({}, { 
    get:z=>console.log('a'), 
    getPrototypeOf:z=>console.log('b'), 
}); 
Object.getPrototypeOf(_)/*b*/ 
Verwandte Themen