Kaa*_*rde 8 javascript prototype v8
在阅读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"}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都如预期.但是,如果我这样做:
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"}
Run Code Online (Sandbox Code Playgroud)
然后coke.__proto__ === undefined.为什么是undefined第二种情况?
我曾经为这种行为打开了一个问题,但它已被关闭为符合标准的行为.根据该问题的接近原因:
这是按照规定工作的.ES6
__proto__是在Object.prototype上定义的getter.对于在其原型链中没有该对象的对象,它是不可访问的(就像,例如,hasOwnProperty不是).您需要使用Object.getPrototypeOf.
确实如此:ES6 B.2.2.1节定义Object.prototype.__proto__; 因此,该__proto__财产继承自Object.prototype.但是,您的coke对象是使用创建的Object.create(null),因此它Object.prototype的原型链中没有.
对象始终具有其原型的内部知识,存储在其[[Prototype]]内部插槽中.该__proto__属性是一种通过代码访问内部已知原型的方法.对象缺少__proto__属性不会影响其[[Prototype]]槽,它仍然存在.
要完全清楚:coke 确实有原型(存储在[[Prototype]]中),原型就是对象drink.你可以看到这个Object.getPrototypeOf(coke).然而,那是整个原型链,因为原型drink是null.因此,coke不能继承__proto__,Object.prototype.__proto__因为它Object.prototype在原型链中没有.