2017-11-04 75 views
1

我们知道,当我们试图访问一个对象的属性时,它首先检查对象是否有自己的属性。如果它找不到,它会遍历原型并检查原型链等。任何情况下,当一个对象不遍历其原型链来获得价值?

来到这个问题,请检查下面的代码片段(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的值吗?

+0

'CT.prototype'作为原型新的'CT'实例。 'Object.create(CT);'用'CT'本身作为原型创建一个新对象。如果你想'CT.prototype'成为原型,你必须调用'Object.create(CT.prototype)'。 –

+0

*“任何情况下,当一个对象没有遍历其原型链获得价值?”*不。 –

回答

2

您似乎已经通过new operator调用构造函数Object.create()混淆。

如果你这么说的:

var myObj = new CT(); 

然后myObj会被链接到CT.prototype,因此myObj.myValue4

但是通过使用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); 
0

原型是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 
相关问题