我是编写OO JS的新手,但这让我很难过。所以我设置了新的Call对象,然后定义了我认为是空数组的东西。当我调用AddFieldQueryToArray()时,我得到了
Uncaught TypeError: Cannot call method 'push' of undefined
在this.fieldArray.push(field)
我真的不知道为什么。我也在构造函数中尝试了this.fieldArray = fieldArray;
。
function Call()
{
var fieldArray = new Array();
var queryArray = new Array();
}
Call.prototype.AddFieldQuerysToArray = function(field,query)
{
if(field !== 'undefined')
{
this.fieldArray.push(field);
}
this.queryArray.push(query);
}
答案 0 :(得分:10)
您应该在构造函数中引用this.
的实例属性:
function Call()
{
this.fieldArray = [];
this.queryArray = [];
}
new Array()
有一条我在上面使用过的快捷方式[]
。
如果你使用var fieldArray = [];
,你将创建一个局部变量,一旦你的实例被创建就会被销毁,除非你使用这种结构:
function Call()
{
var fieldArray = [];
this.AddFieldQuerysToArray = function(field, query) {
// ...
fieldArray.push(field);
}
}
这为整个实例的生命周期中fieldArray
“保持活动”的每个实例创建了一个闭包。
答案 1 :(得分:1)
function Call()
{
this.fieldArray = [];
this.queryArray = [];
}
Call.prototype.AddFieldQuerysToArray = function(field,query)
{
if(field !== 'undefined')
{
alert('field==='+this.fieldArray);
this.fieldArray.push(field);
}
alert('field==='+this.fieldArray);
this.queryArray.push(query);
alert(this.queryArray);// to check
alert(this.fieldArray);// to check
};
field = 'exampleField';
query = 'exampleField';
var cally = new Call();
cally.AddFieldQuerysToArray(field,query); //change
唯一的问题是你正在调用Call.prototype.AddFieldQuerysToArray()
方法,而实际上是这个值
引用Call.prototype
对象的执行上下文,该对象没有数组fieldArray
和queryArray
。
通过编码AddFieldQuerysToArray()
调用原型方法cally.AddFieldQuerysToArray(field,query);
指的是执行上下文
通过其构造函数获得两个数组的cally
实例。
答案 2 :(得分:0)
这是一个非常老的帖子&答案是由杰克给出的。必须使用this
来避免错误。
但代码块中使用了反模式。应该避免使用new Array()
。更好的方法是使用Array Literal Notation。请按照此StackOverflow回答What’s the difference between "Array()" and "[]" while declaring a JavaScript array?了解详细信息。
但要点是,如果只为Array构造函数提供了一个参数,那么它将被解释为数组的长度但不会是数组中的第一个元素。
console.log(new Array(10).length);//10
console.log(new Array(10)[0] === undefined);//true