1

// 回答済み - コードの行を参照

おそらく呼び出しているメソッドが宣言されていないため、例外がスローされます。しかし、実際にはそうなので、なぜそれが起こっているのかわかりません

Uncaught TypeError: Object #<Unit> has no method 'onLoopEvent' 

そして、コードは

function Unit () {
     var item = new Item();
     item.onLoopEvent = function( index ) {
         ...
     }

     return item; // <--- WAS missing this - as pointed out first by ars265
}

items[ items.length ] = new Unit();

// main loop that gets called periodically
function onLoop () {
    for( var i=0; i < items.length ; i++ ) {
    var item = items[ i ];
    item.onLoopEvent( i );
    }
}

なぜこれが起こっているのかわかりません。メソッドが正しく宣言されているようです

4

4 に答える 4

0
function Unit() {
    this.onLoopEvent = function (index) {
        //...
    };
}

var items = [];
for (var i = 0; i < 5; ++i) items.push(new Unit());

function onLoop() {
    var i;
    for (i = 0; i < items.length; ++i) {
        items[i].onLoopEvent(i);
    }
}
于 2013-09-03T17:27:41.447 に答える
0

new Unit()配列インデックス項目を に設定しているため、何も返されていないという事実に対処してくださいundefined。これが問題の原因となっています。

修正 修正されundefinedたように、値が返されない場合に関数が返すものであるため、 を返しません。代わりに、関数の新しいインスタンスを返していUnitます。それは私が同時に食べながら答えるために得たものです。;)

于 2013-09-03T17:27:48.367 に答える
0

new Unit()Unitインスタンスではなく、インスタンスを返しItemます。items配列はUnitインスタンスへの参照のみを保持します。

できることは次のとおりです。

function Unit () {
     this.item = new Item();
     this.item.onLoopEvent = function( index ) {
         ...
     }
}

次に、ループで:

// main loop that gets called periodically
function onLoop () {
    for( var i=0; i < items.length ; i++ ) {
    var unit = items[ i ];
    unit.item.onLoopEvent( i );
    }
}
于 2013-09-03T17:24:52.123 に答える
0

私はあなたがこれを意味すると思います:

var Item = function() {}
function Unit () {
     var item = new Item();
     item.onLoopEvent = function( index ) {
         console.log(index);
     }
     return item;
}
var items = [];
items[ items.length ] = Unit();

// main loop that gets called periodically
function onLoop () {
    for( var i=0; i < items.length ; i++ ) {
    var item = items[ i ];
    item.onLoopEvent( i );
    }
}
onLoop();

ユニットで何かを返す必要があります。または、戻らない場合は、this.item = new Item();を使用する必要があります。ユニット機能に何かを付加します。そうしないと、新しく作成されたアイテムはユニットのスコープ内にのみ残されます。

Unit の前にnewを使用していないことに注意してください。これは、関数を呼び出しており、新しいインスタンスを作成していないためです。

于 2013-09-03T17:25:24.997 に答える