gpt4 book ai didi

javascript - 为什么对象中的属性是未定义的,尽管它存在于对象的 __proto__ 中?

转载 作者:行者123 更新时间:2023-11-29 23:45:45 25 4
gpt4 key购买 nike

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

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 尽管已将具有该属性的原型(prototype)分配给它?

最佳答案

__proto__Object.prototype 的 getter 和 setter。

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

如果你创建了一个不继承自Object.prototype的对象,它就没有那个特殊的属性,设置__proto__将创建一个完全正常的属性和其他人一样。

这里是 Object.prototype.__proto__ 的 setter 设置原型(prototype)而不是创建属性:

> 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

使用Object.setPrototypeOf相反(总是):

Object.setPrototypeOf(a, b);

关于javascript - 为什么对象中的属性是未定义的,尽管它存在于对象的 __proto__ 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44275103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com