对象不遍历其原型链以获取值的任何情况?
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
正如我们所知,当我们尝试访问对象的 属性 时,它首先检查对象是否有自己的 属性。如果没有找到,则遍历原型并检查,依此类推原型链。
问题来了,请检查下面的代码片段(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()
先看数组
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