3

以下のコードで:

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;

私がここで間違っていることは何ですか?私が理解していることから、オブジェクトは適切に初期化されており、値の割り当ては正しいです。Firefox18.0.2バージョンとChrome25でこれをテストしています。

4

4 に答える 4

1

これで問題は解決すると思います

this.something.fill.call(this.something);
于 2013-02-27T10:24:38.680 に答える
1

この問題を既存のコードで見つけ、提案された解決策を作成しましたが、あなたの意図が正確に明確ではないため、ニーズとは少し異なる可能性があります。必要に応じて変更してください。

問題

主な問題はオブジェクトに起因しFilledObjectArrayます。このオブジェクトのプロトタイプには関数が割り当てられ、fill次に値が1のint型のプロパティoneが割り当てられます。したがって、このオブジェクトには2つのプロパティがあり、1つは関数、もう1つはintであることに注意してください。

したがって、このコードを実行すると...

for (key in this.something) {
    $("#some-div").append(this.something[key]);  //Item 1
}

ループの2つの反復が発生します。1つは関数に対して、もう1つfillはプロパティに対してoneです。fillこの問題は、キーの反復で発生します。これは、関数を受け入れることができないthis.something[key]に渡されるためappend()、jQueryが関数をトリガーする原因になります。fillこれが発生すると、関数の実行コンテキスト内で、プロパティを持たないにthisが割り当てられ、TypeErrorがスローされます。私はこれについて以下にコメントしました:#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();
        });
    });

});

提案された解決策

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();
        });
    });
});
于 2013-02-27T11:01:03.603 に答える
0

私はあなたがこれを探していると思います:

for (key in this.something) {
  if(this.something.hasOwnProperty(key)){
    $("#some-div").append(JSON.stringify(this.something[key]));
  }
}

jsbin

hasOwnProperty継承プロパティを実行せずにオブジェクトのプロパティを反復処理するために使用する必要があります。

于 2013-02-27T11:00:49.360 に答える
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.filledObject)ではなくオブジェクト自体(this.something)にアクセスしようとしました

于 2013-02-27T11:27:39.710 に答える