为什么可以检索原型但是__proto__在JavaScript中是未定义的?

时间:2015-07-01 11:09:32

标签: javascript google-chrome prototype v8

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

__proto__ VS. prototype in JavaScript

How does __proto__ differ from constructor.prototype?

我可以在Chrome下的以下代码中获取对象__proto__的{​​{1}}值。

f

但是,在将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的{​​{1}}应该指向__proto__。为什么f的值为Foo.prototype

2 个答案:

答案 0 :(得分:5)

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

来自mdn

  

虽然目前大多数浏览器都支持Object.prototype。 proto ,但它的存在和确切行为仅在ECMAScript 6规范中标准化为传统功能,以确保Web浏览器的兼容性。为了获得更好的支持,建议仅使用Object.getPrototypeOf()。

答案 1 :(得分:3)

According to the ES2015 spec__proto__继承自Object.prototype 的访问者属性。

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

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

另见关于Chromium问题的解决方案“obj.__proto__ is undefined if prototype chain does not contain Object.prototype”:

  

这是按照指定的方式工作。 ES6 __proto__是在Object.prototype上定义的getter。对于在其原型链中没有该对象的对象,它是不可访问的(就像,例如,hasOwnProperty不是)。您需要使用Object.getPrototypeOf。