之間的區別我知道後者是非標準的。但是Object.getPrototypeOf
與__proto__
之間有區別嗎?我正在研究JavaScript中的原型鏈是如何工作的,並希望在這部分中清楚。Object.getPrototypeOf與__proto__
謝謝。
之間的區別我知道後者是非標準的。但是Object.getPrototypeOf
與__proto__
之間有區別嗎?我正在研究JavaScript中的原型鏈是如何工作的,並希望在這部分中清楚。Object.getPrototypeOf與__proto__
謝謝。
從MDN:
Object.getPrototypeOf()是標準的執行過時且不適用對象.__ proto__屬性。但它是一種只讀方法。
所以基本上他們完成,如果你正在閱讀的價值,除了__proto__
同樣的事情是非標準的。 __proto__
也可能允許您設置現有對象的原型,但通常這不是一個好主意,所以現在標準將使用構造函數或Object.create
來創建具有特定原型的對象。也就是說,ES6規範還定義了一個setPrototypeOf
用於設置對象的原型,但出於性能原因,除非明確需要,否則最好避免這種情況。
最初,__proto__
是早期版本的Mozilla瀏覽器(3.5之前的Firefox)的Mozilla版本。它僅在2008年被編入ECMAScript 3.1中。
一個區別是可以更改__proto__
(雖然設計實踐很糟糕),而getPrototypeOf
是閱讀功能。
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
另一個區別是它們如何處理名稱衝突的可能性不大的情況下:
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
_ = new Proxy({}, {
get:z=>console.log('a'),
getPrototypeOf:z=>console.log('b'),
});
_.__proto__/*a*/
—和<getPrototypeOf>爲一個getPrototypeOf:
_ = new Proxy({}, {
get:z=>console.log('a'),
getPrototypeOf:z=>console.log('b'),
});
Object.getPrototypeOf(_)/*b*/
感謝您指出名稱衝突,很高興知道。 – simonzack