在下面的代码中:
var FilledObjectArray = function() {
this.filledObject = {};
};
FilledObjectArray.prototype = {
fill: function() {
this.filledObject["one"] = 1;
}
};
var SomeClass = function() {
this.something = new FilledObjectArray();
};
SomeClass.prototype = {
showContents: function() {
this.something.fill();
for (key in this.something) {
$("#some-div").append(this.something[key]);
}
}
};
$(document).ready(function() {
var s = new SomeClass();
$(".bla").each(function() {
$(this).click(function() {
s.showContents();
});
});
});
我在Firebug控制台中收到此错误:
TypeError: this.filledObject is undefined
this.filledObject["one"] = 1;
我在这里做错了什么?根据我的理解,对象被正确初始化并且值分配是正确的。我正在使用Firefox 18.0.2版本和Chrome 25进行测试。
答案 0 :(得分:1)
我认为这应该可以解决你的问题
this.something.fill.call(this.something);
答案 1 :(得分:1)
我在现有代码中发现了这个问题,并创建了一个建议的解决方案,但是我并不完全清楚您的意图,因此可能与您的需求略有不同,请根据需要进行修改。
问题
主要问题源于FilledObjectArray
对象。该对象的原型被赋予一个函数fill
,然后分配一个int类型的属性one
,其值为1.所以请记住这个对象有两个属性,一个是函数,一个是int。
所以当你执行这段代码时......
for (key in this.something) {
$("#some-div").append(this.something[key]); //Item 1
}
循环的两次迭代发生,一次是函数fill
,一次是属性one
。问题发生在fill
键的迭代上,因为this.something[key]
被传递给append()
,它可以接受函数,导致jQuery触发函数。发生这种情况时,在fill
函数的执行上下文中,this
被分配给#some-div
,filledObject
没有var FilledObjectArray = function() {
this.filledObject = {}; //Fill is an object
};
FilledObjectArray.prototype = {
fill: function() {
this.filledObject["one"] = 1;
}
};
var SomeClass = function() {
this.something = new FilledObjectArray();
};
SomeClass.prototype = {
showContents: function() {
this.something.fill();
for (key in this.something) {
$("#some-div").append(this.something[key]); //The fill function is called here
}
}
};
$(document).ready(function() {
var s = new SomeClass();
$(".bla").each(function() {
$(this).click(function() {
s.showContents();
});
});
});
属性,导致引发TypeError。我在下面评论了一些内容:
var FilledObjectArray = function() {
this.filledObject = [];
};
FilledObjectArray.prototype.fill = function(){
console.log(this);
this.filledObject[0] = 1;
};
var SomeClass = function() {
this.something = new FilledObjectArray();
};
SomeClass.prototype = {
showContents: function() {
this.something.fill();
for (var x = 0; x < this.something.filledObject.length; x++){
$("#some-div").append(this.something.filledObject[x]);
}
}
};
$(document).ready(function() {
var s = new SomeClass();
$(".bla").each(function() {
$(this).click(function() {
s.showContents();
});
});
});
提议的解决方案
{{1}}
答案 2 :(得分:0)
我认为你在寻找这个:
for (key in this.something) {
if(this.something.hasOwnProperty(key)){
$("#some-div").append(JSON.stringify(this.something[key]));
}
}
您需要使用hasOwnProperty
迭代对象的属性而不执行继承属性。
答案 3 :(得分:0)
我现在感觉有点愚蠢,但这是解决方案:
SomeClass.prototype = {
showContents: function() {
this.something.fill();
for (key in this.something.filledObject) {
if (this.something.filledObject.hasOwnProperty(key)) {
$("#some-div").append(this.something.filledObject[key]);
}
}
}
};
我试图访问对象本身(this.something)而不是对象属性(this.something.filledObject)