众所周知,当我们尝试访问对象的属性时,首先检查对象是否有自己的属性。如果找不到,它会遍历原型并检查原型链等等。
提出问题,请查看以下代码段(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在其原型(2nd console.log语句)中可用?难道它不会遍历原型链来获取myValue的值吗?
答案 0 :(得分:2)
您似乎将Object.create()
与通过new
operator调用构造函数混淆了。
如果你说:
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);
答案 1 :(得分:0)
prototype是实例变量,当您使用new Obj()
首先看到Array
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