3

これは私の最初の SO 投稿です。このコミュニティが持っていて共有している情報に永遠に感謝しています. ありがとう。

私は Flash から来ましたが、何を質問するのが正しいのかさえわかりません。私にできることは、コード例をレイアウトして、何をしようとしているのかを説明することだけです。ここで説明しようとしている用語を完全には理解していないので、省略するのが最善だと思います。

以下のコードは、私の質問に関連すると思われる部分のみが含まれているため、不完全です。私の問題を確認するには、コード内のコメントを参照してください。

編集: ここに完全なソース ファイル: [リンクが削除されました] console.log は問題の問題を出力します。

    <script type="text/javascript"> 
    var a_chests = [];
    var chestID = 0;

    //I'm creating a plugin to be able to make multiple instances
    (function ($) {
        $.fn.chestPlugin = function (option) {
            //This function creates a master sprite object which many of my sprites will use
            //I've simplified the features to get to the heart of my question
            var DHTMLSprite = function (params) {
                var ident = params.ident,
                var that = {
                    getID: function(){
                        return ident;
                    }
                };
                return that;
            };

            //ChestSprite inherits DHTMLSprites properties and then adds a few of its own
            var chestSprite = function(params) {
                var ident = params.ident,
                that = DHTMLSprite(params);
                that.reveal=function(){
                    console.log(ident);
                };

                return that;
            };

            //Here I create multiple instances of the chests
            var treasure = function ( $drawTarget,chests) {
                for (i=0;i<chests;i++){
                    var cs = chestSprite({
                        ident: "chest"+chestID
                    })
                    console.log(cs.reveal()) 
                    //This logs "chest0", "chest1", "chest2" as the for loop executes
                    //This behavior is correct and/or expected!

                    a_chests[chestID]={id:i,ob:cs};
                    //I add a reference to the new chestSprite for later

                    chestID++;
                    //increment the chestID;
                }
                console.log(a_chests[1].ob.reveal());
                //This always logs "chest2" (the last chest that is created), even though
                //the logs in the for loop were correct. It seems it is referencing the
                //DHTML object (since the DHTMLSprite function returns that;) and since 
                //there is no reference to which chest I need, it passes the last one.

                //Is there any way I can pass a reference to DHTMLSprite in order to retain
                //the reference to the three individual chests that are created?

                //Is there another solution altogether? Thanks!!!
            };

            //The rest of the code.
            return this.each(function () {
                var $drawTarget = $(this);
                treasure($drawTarget,3);
            });
        };
        })(jQuery);


        </script>
4

2 に答える 2

2

「それ」をローカル変数として宣言するのを忘れたので、反復ごとに上書きされています。

    var chestSprite = function(params) {
      var that;
      var animInterval;
      ...
于 2012-10-28T02:32:55.983 に答える
0

あなたが書くとき:

a_chests[chestID]={id:i,ob:cs};

このオブジェクトのインスタンスではなく、csオブジェクト自体を割り当てています。後でcsを変更すると、obプロパティに保存したものも変更されます。

私はあなたが必要なのは閉鎖だと思います:

for (i=0;i<chests;i++){
(function(){
    var cs = chestSprite({ident: "chest"+chestID});
    a_chests[chestID]={id:i,ob:cs};
})();
}

このように、各ループは異なるcsオブジェクトを作成します。

于 2012-10-28T01:15:18.823 に答える