Javascript 为什么对象中的属性未定义,尽管它存在于对象';原版?

Javascript 为什么对象中的属性未定义,尽管它存在于对象';原版?,javascript,object,prototypal-inheritance,proto,Javascript,Object,Prototypal Inheritance,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 prot

首先,下面是一个按预期工作的示例:

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
返回
未定义的
,尽管已为其分配了具有该属性的原型?

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>是
对象的getter和setter

> Object.getOwnPropertyDescriptor(Object.prototype, '__proto__')
{ get: [Function: get __proto__],
  set: [Function: set __proto__],
  enumerable: false,
  configurable: true }
如果创建的对象不是继承自
object.prototype
,则该对象没有该特殊属性,设置
\uuuuuu proto\uuuu
将创建一个与任何其他属性一样的完全正常属性

下面是
Object.prototype.\uuuu proto\uuuu
的setter设置原型而不是创建属性:

> var a = {};
> a.__proto__ = { foo: 'bar' };
> Object.prototype.hasOwnProperty.call(a, '__proto__')
false
这是未使用的setter,因为
Object.prototype
不在链中:

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


a仍然没有定义,原型引用了b。所以toString应该返回未定义的
Object.setPrototypeOf(a, b);