当一个对象没有遍历其原型链以获得价值时的任何情况?

时间:2017-11-04 05:40:15

标签: javascript prototype proto object-create prototype-chain

众所周知,当我们尝试访问对象的属性时,首先检查对象是否有自己的属性。如果找不到,它会遍历原型并检查原型链等等。

提出问题,请查看以下代码段(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的值吗?

2 个答案:

答案 0 :(得分:2)

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

如果你说:

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);

答案 1 :(得分:0)

prototype是实例变量,当您使用new Obj()

创建obj时,可以使用obj.prototypeName访问原型

首先看到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