现在我正在学习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
?
答案 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。