任何情况下,当一个对象不遍历其原型链来获得价值?
问题描述:
我们知道,当我们试图访问一个对象的属性时,它首先检查对象是否有自己的属性。如果它找不到,它会遍历原型并检查原型链等。任何情况下,当一个对象不遍历其原型链来获得价值?
来到这个问题,请检查下面的代码片段(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被返回undefined即使myvalue的可在其原型(第二个console.log语句)?它不应该遍历原型链来获取myValue的值吗?
答
您似乎已经通过new
operator调用构造函数Object.create()
混淆。
如果你这么说的:
var myObj = new CT();
然后您myObj
会被链接到CT.prototype
,因此myObj.myValue
是4
。
但是通过使用Object.create(CT)
,您创建了一个新的对象,其原型是CT
函数本身。所以CT.prototype
是而不是你的新对象的原型链的一部分。请注意,CT.prototype
不在CT
的原型链中,相反,它指定的对象将成为用new CT()
创建的东西的原型。
一个更正确的使用Object.create()
允许访问从原型myValue
属性是:
var CT = {
myValue : 4
};
var myObj = Object.create(CT);
console.log(myObj.myValue); //logs 4
或与您现有的CT()
功能和CT.prototype
你可以说:
myObj = Object.create(CT.prototype);
答
原型是ins可变孟清湘,你可以用obj.prototypeName访问原型当你与new Obj()
先看到阵列创建OBJ
Array.forEach
// undefined
Array.prototype.forEach
// ƒ forEach() { [native code] }
new Array().forEach
// ƒ forEach() { [native code] }
[].forEach
// ƒ forEach() { [native code] }
看到你的CT类
function CT() {}
CT.prototype.myValue = 4;
var ct1 = new CT();
var ct2 = new CT();
ct1.myValue = 100;
console.log(ct1.myValue); //logs 100
console.log(ct2.myValue); //logs 4
'CT.prototype'作为原型新的'CT'实例。 'Object.create(CT);'用'CT'本身作为原型创建一个新对象。如果你想'CT.prototype'成为原型,你必须调用'Object.create(CT.prototype)'。 –
*“任何情况下,当一个对象没有遍历其原型链获得价值?”*不。 –