对象不遍历其原型链以获取值的任何情况?

Any cases when an object does not traverse its prototype chain to get value?

正如我们所知,当我们尝试访问对象的 属性 时,它首先检查对象是否有自己的 属性。如果没有找到,则遍历原型并检查,依此类推原型链。

问题来了,请检查下面的代码片段(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 在其原型中可用(第二个 console.log 语句)?它不应该遍历原型链来获取 myValue 的值吗?

你好像搞糊涂了Object.create() with calling a constructor function via the 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);

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

创建obj时,你可以用obj.prototypeName访问prototype

先看数组

Array.forEach
// undefined

Array.prototype.forEach
// ƒ forEach() { [native code] }

new Array().forEach
// ƒ forEach() { [native code] }

[].forEach
// ƒ forEach() { [native code] }

查看您的 CT class

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