2013-07-20 19 views
6

之間的區別我知道後者是非標準的。但是Object.getPrototypeOf__proto__之間有區別嗎?我正在研究JavaScript中的原型鏈是如何工作的,並希望在這部分中清楚。Object.getPrototypeOf與__proto__

謝謝。

回答

12

MDN

Object.getPrototypeOf()是標準的執行過時且不適用對象.__ proto__屬性。但它是一種只讀方法。

所以基本上他們完成,如果你正在閱讀的價值,除了__proto__同樣的事情是非標準的。 __proto__也可能允許您設置現有對象的原型,但通常這不是一個好主意,所以現在標準將使用構造函數或Object.create來創建具有特定原型的對象。也就是說,ES6規範還定義了一個setPrototypeOf用於設置對象的原型,但出於性能原因,除非明確需要,否則最好避免這種情況。

6

最初,__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 
+0

感謝您指出名稱衝突,很高興知道。 – simonzack

0

Proxy對待<__proto__>作爲get

_ = 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*/