2017-05-31 88 views
2

首先,這裏是按預期工作的例子:爲什麼對象中的屬性是未定義的,雖然它存在於對象的__proto__中?

let a = { foo: 10 } 
let b = { bar: 20 } 
a.__proto__ = b 

// returns value from prototype just fine 
a.bar; // 20 

這裏是這是個問題,因爲預期不工作下的例子。爲什麼?

// "a" has no prototype when created this way 
let a = Object.create(null); 

// "b" has prototype and it is a JS native Object with a whole slew of its native props 
let b = {}; 

// assign "a" a prototype 
a.__proto__ = b; 

// let's try 
a.toString; // undefined 

// but... 
a.__proto__ .toString; // function toString() { [native code] } 

爲什麼a.toString回報undefined雖然與財產原型分配給它?

+0

a仍然未定義w ith原型參考b。所以toString應該返回undefined – binariedMe

回答

1

__proto__Object.prototype上的吸氣和吸氣裝置。

> Object.getOwnPropertyDescriptor(Object.prototype, '__proto__') 
{ get: [Function: get __proto__], 
    set: [Function: set __proto__], 
    enumerable: false, 
    configurable: true } 

如果您創建一個對象,不從Object.prototype繼承,它不具有特殊的屬性,並設置__proto__將創建一個完全正常的財產像任何其他。

這裏的Object.prototype.__proto__的設置器的原型,而不是創建一個屬性:

> var a = {}; 
> a.__proto__ = { foo: 'bar' }; 
> Object.prototype.hasOwnProperty.call(a, '__proto__') 
false 

,這裏是沒有被使用,因爲Object.prototype是二傳手未在鏈:

> var b = Object.create(null); 
> b.__proto__ = { foo: 'bar' }; 
> Object.prototype.hasOwnProperty.call(b, '__proto__') 
true 

使用Object.setPrototypeOf代替(始終):

Object.setPrototypeOf(a, b); 
+0

Downvote on correct answer why? – Ryan

+0

我沒有這樣做。我甚至還沒有讀過它 – Green

相關問題