TypeError:对象未定义

时间:2013-02-27 10:20:55

标签: javascript jquery

在下面的代码中:

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进行测试。

4 个答案:

答案 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-divfilledObject没有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]));
  }
}

jsbin

您需要使用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)