2017-05-31 7 views
2

まず、ここでは期待どおりに動作例です。オブジェクトの__proto__に存在するにもかかわらず、オブジェクトのプロパティが定義されていないのはなぜですか?

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

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

そしてここでは、期待通りに動作しない問題、下にある例です。どうして? a.toStringリターンundefinedは、そのプロパティを持つプロトタイプがそれに割り当てられていたが、なぜ

// "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] } 

+0

aは未定義ですw iのプロトタイプ参照b。したがって、toStringは未定義の結果を返す必要があります – 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の正解はなぜですか? – Ryan

+0

私はそれをしませんでした。私はまだそれを読んでいない – Green

関連する問題