在阅读 Javascript 原型时,我遇到了这种我无法解释的行为。我正在 chrome 的控制台(V8)中对此进行测试。
var fruit = {taste:'good'};
var banana = Object.create(fruit);
console.log(banana.taste); //"good"
console.log(banana.__proto__); //Object {taste: "good"}
console.log(Object.getPrototypeOf(banana)); //Object {taste: "good"}
到目前为止,一切都如预期。
但是如果我这样做:
var drink = Object.create(null);
Object.defineProperty(drink, 'taste', {value:"nice"});
var coke = Object.create(drink);
console.log(coke.taste); //"nice"
console.log(coke.__proto__); //undefined
console.log(Object.getPrototypeOf(coke)); //Object {taste: "nice"}
then coke.__proto__ === undefined
。为什么undefined
在第二种情况下?
I once 为此行为提出了一个问题,但它作为符合标准的行为而被关闭。根据问题关闭原因:
这是按规定工作的。 ES6__proto__
是在 Object.prototype 上定义的 getter。对于原型链中没有该属性的对象,它是不可访问的(就像 hasOwnProperty 不可访问一样)。您需要使用 Object.getPrototypeOf 代替。
这确实是事实:ES6 B.2.2.1 节定义Object.prototype.__proto__
;因此,__proto__
财产继承自Object.prototype
。然而,你的drink
对象是用创建的Object.create(null)
,所以它没有Object.prototype
在其原型链中。
一个对象总是有其原型的内部知识,存储在它的[[原型]] 内部插槽. The __proto__
属性是一种通过代码访问内部已知原型的方法。一个物体缺少一个__proto__
属性不会影响其 [[Prototype]] 插槽,该插槽仍然存在。
完全清楚地说:coke
does有一个原型(存储在 [[Prototype]] 中),该原型就是对象drink
。你可以看到这个Object.getPrototypeOf(coke)
。然而,那是整个原型链,因为原型drink
is null
。所以,coke
不能继承__proto__
from Object.prototype.__proto__
因为它没有Object.prototype
在其原型链中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)