5

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

    }
4

3 回答 3

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在该实例的整个生命周期中“保持活动状态”。

于 2013-06-10T09:11:15.637 回答
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实例通过其构造函数获得了其中声明的两个数组。

于 2013-06-10T09:51:10.770 回答
0

这是一个非常古老的帖子,答案是由杰克给出的。this必须用于避免错误。

但是代码块中使用了一种反模式。new Array()应该避免。更好的方法是使用 Array Literal Notation。按照这个 StackOverflow 回答声明 JavaScript 数组时“Array()”和“[]”有什么区别?详情。

但要点是,如果只为 Array 构造函数提供一个参数,则该参数将被解释为 Array 的长度,但不会成为数组中的第一个元素。

console.log(new Array(10).length);//10
console.log(new Array(10)[0] === undefined);//true
于 2017-06-12T17:27:28.733 回答