构造函数中定义的Javascript数组在原型中未定义

时间:2013-06-10 09:09:23

标签: javascript

我是编写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);

    }

3 个答案:

答案 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对象的执行上下文,该对象没有数组fieldArrayqueryArray

通过编码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