正如我们所知,当我们试图访问一个对象的属性时,它首先会检查该对象是否有自己的属性。如果没有找到,则遍历原型(prototype)并检查,依此类推原型(prototype)链。
问题来了,请检查下面的代码片段( http://jsbin.com/mabajidoti/edit?js,console )
function CT() {}
CT.prototype.myValue = 4;
var myObj = Object.create(CT);
console.log(myObj.myValue); //logs undefined
console.log(myObj.prototype.myValue) //logs 4
从上面的代码片段中,第一个 console.log 语句 myObj.myValue 返回未定义,即使 myValue 在其原型(prototype)中可用(第二个 console.log 语句)?它不应该遍历原型(prototype)链来获取 myValue 的值吗?
最佳答案
你好像搞糊涂了Object.create()
通过 new
operator 调用构造函数.
如果你说:
var myObj = new CT();
然后您的myObj
将链接到CT.prototype
,因此myObj.myValue
将是4
。
但通过使用 Object.create(CT)
,您已经创建了一个新对象,其原型(prototype)是 CT
函数本身。所以 CT.prototype
不是新对象原型(prototype)链的一部分。请注意,CT.prototype
不在 CT
的原型(prototype)链中,而是指定对象,该对象将作为使用 new CT( )
。
更正确地使用 Object.create()
以允许从原型(prototype)访问 myValue
属性是:
var CT = {
myValue : 4
};
var myObj = Object.create(CT);
console.log(myObj.myValue); //logs 4
或者使用你现有的 CT()
函数和 CT.prototype
你可以说:
myObj = Object.create(CT.prototype);
关于javascript - 对象不遍历其原型(prototype)链以获取值的任何情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107820/