0

静的変数が必要になるたびに、それを使用して永続化する必要があるオブジェクトにプロパティとして追加することになります。

特に、この index here( MT.MAOrb.startR.index) は静的にするか、関数がコールバックによって再度呼び出されるまでその値を保持する必要があります。

このフォームを使用するのが最善の方法ですか?

MT.MAOrb.startR.index

/**
 ** MAOrb
 */


MT.MAOrb =
{
    pre : function() {
        var o_p = {
            model : 'MAOrb'
            };
        return o_p;
    },
    post : function( o_p ) {
        MT.MAOrb.startR( o_p );
    },
    startR: function( o_p ){
        var sky = document.getElementById( 'Ab1' );
        if( MT.MAOrb.startR.index === undefined ) {
            var size = Object.size( o_p );  
            console.log( 'size' + size );
            var index1 = MT.MAOrb.random( 0, size - 1 );
            console.log( 'index1' + index1 );
            MT.MAOrb.startR.index = index1;
            MT.MAOrb.startR.o_p = o_p;
        }else{ 
            MT.MAOrb.startR.index++; 
        }
        var image_element = MT.MAOrb.makeElement( MT.MAOrb.startR.o_p[ MT.MAOrb.startR.index ] );
        sky.appendChild( image_element );
        MT.MAOrb.moveLinear( image_element );
    },// ....more code here
};
4

3 に答える 3

1

それは実際にはかなり奇妙な方法だと思います。Javascriptは関数レベルのスコープを提供し、即時呼び出し関数式(IIFE)を使用することで、それを有利に使用できます。

myObject = {
    count: (function () {  // this function is invoked immediately
        var staticCounter = 0;
        return function () { // this is the actual 'count' function
            return ++staticCounter;
        };
    }())
};

myObject.count(); // 1
myObject.count(); // 2

これがより良いアプローチと見なされる理由の1つは、静的変数を完全に非表示にすることです。行う場合はmyObject.count.staticCounter、他のコードその変数の読み取りまたは書き込みを行っている可能性があります。明らかにそれを望まないでしょうが、これを行うと、その変数のスコープが完全に保証され、将来のデバッグとリファクタリングが容易になります。

于 2012-07-12T23:04:06.050 に答える
1

Javascript には、静的変数と非静的変数の概念がありません。すべてがオブジェクトの単なるプロパティです。そのため、静的変数を行う正しい方法または間違った方法はありません。静的な変数を行う正しい方法または間違った方法があるだけです。

そうは言っても、変数を固定(モジュールのような)オブジェクトのプロパティとして追加することは、あなたがやっているように、ほとんどあなたの最善の策です(つまり、ベストプラクティス)。Backbone.js のようなライブラリを使用している場合を除きます。これは実際に静的変数のサポートをその「モデル」に追加します (つまり、クラス システムです)。

于 2012-07-12T22:53:56.990 に答える
1

パブリックな静的プロパティをエミュレートしようとしている場合、それはまったく問題のない方法です。

JavaScript は古典的なオブジェクト指向言語ではありません。プロトタイプです。

影響の 1 つは、言語には静的という概念が実際には存在しないことです。

別のオブジェクトがプロパティを直接読み取って変更できることを気にしない限り、あなたのやり方はまったく問題ありません。

于 2012-07-12T22:54:19.227 に答える