0

javascriptにエンティティ/コンポーネントコードがあります。それはほとんど完了しましたが、私はこの本当に奇妙な問題にぶつかっています。私のエンティティには、子をプッシュする子配列があり、そのコンポーネントの他の配列(componentsDictionary、名前は変更されますが、以前はdictでした)があります。

this.childrens.push(obj)を呼び出すと、this.childrens内とobj.childrens内の両方でオブジェクトがプッシュされます...レンダリングツリーを更新するときに無限ループが発生します。

おそらくJSでのクロージャの本当に奇妙な処理の問題です...

問題のあるコードは次のとおりです。

Entity.prototype = {
    childrens : [],
    componentsDictionary : [],
    sharedAttributes : {}, // This data is shared for all components
    debugName : "Entity Default Name",
    bubblee : null,

    Add : function(obj) {
        if (obj instanceof Entity) {
            alert(obj.debugName); // alerts "entity 0"
            alert(this.debugName); // alerts "root"

            alert(obj.childrens.length); // "alerts 0"
            this.childrens.push(obj);
            alert(obj.childrens.length); // "alerts 1"
            // how the f... !%!??!%11?
        }
        else if (obj instanceof IComponent) {
            this.componentsDictionary[obj.type].push(obj);
        }
        else {
            throw new Exceptions.IllegalAction("Attempted to add something else than an entity or a component to an entity.");
        }
    },

どうもありがとう!

ニック

4

1 に答える 1

1

"childrens" 配列をプロトタイプ オブジェクトに配置したため、"Entity" のすべてのインスタンスで共有されます。つまり、配列は 1 つだけです。

インスタンスごとに個別の配列が必要な場合は、プロトタイプから削除して追加します

this.childrens = [];

「エンティティ」コンストラクターに。

于 2013-02-17T16:53:47.170 に答える