谷歌铬-为什么原型可以检索,但__proto__在JavaScript中未定义

google chrome - Why the prototype can be retrieved but the __proto__ is undefined in JavaScript?

本文关键字:proto JavaScript 未定义 检索 为什么 原型 谷歌      更新时间:2023-09-26

现在我正在学习JavaScript prototype__proto__,并找到了几个有用的链接

__proto__ VS JavaScript 中的原型

__proto__与constructor.prototype有何不同?

我可以在Chrome下的以下代码中获得对象f__proto__的值。

var Foo = function() {}
var f = new Foo();
f.__proto__
> Foo {} 

然而,在将Foo.prototype.__proto__设置为null之后,__proto__的值为undefined

var Foo = function() {}
Foo.prototype = {name: 'cat', age: 10};
Foo.prototype.__proto__ = null;
var f = new Foo();
f.__proto__
> undefined 

但我可以得到f.name的值,也就是cat。这是我的理解,因为值f.name是可检索的,所以对象f__proto__应该指向Foo.prototype。为什么f.__proto__的值是undefined

__proto__是JavaScript的内部特殊属性。你不应该使用。

来自mdn

虽然Object.protype.proto目前在大多数浏览器中都受到支持,但它的存在和确切行为仅在ECMAScript 6规范中作为一项遗留功能进行了标准化,以确保与web浏览器的兼容性。为了获得更好的支持,建议只使用Object.getPrototypeOf()。

根据ES2015规范,__proto__是从Object.prototype继承的访问器属性。

由于实例f的原型链植根于null,而不是Object.prototype,因此f对象不会从Object.prototype继承任何属性,包括Object.prototype.__proto__

对象仍然在内部知道其原型(通过[[prototype]]内部插槽),但它没有继承用于获取此值的__proto__访问器属性。不过,您仍然可以通过Object.getPrototypeOf(f)访问它。

另请参阅Chromium问题的解决方案"如果原型链不包含Object.prototype,则obj.__proto__未定义":

这是按规定工作的。ES6 __proto__是在Object.prototype上定义的getter。对于原型链中没有getter的对象,它是不可访问的(就像hasOwnProperty不可访问一样)。您需要使用Object.getPrototypeOf。