0

每次我需要一个静态变量时,我最终都会将它作为属性附加到使用它并需要它持久的对象上。

特别是,这里的索引(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 没有静态变量与非静态变量的概念:一切都只是对象的属性。因此,处理静态变量没有正确或错误的方式,只有处理类静态变量的正确或错误方式。

话虽如此,正如您所做的那样,将变量添加为固定(类似模块)对象的属性几乎是您的最佳选择(即最佳实践)。除非您使用的是像 Backbone.js 这样的库,它实际上确实为它的“模型”(即它的类系统)添加了对静态变量的支持。

于 2012-07-12T22:53:56.990 回答
1

如果您尝试模拟公共静态属性,那么这是一种完全可行的方法。

JavaScript 不是经典的面向对象语言。它是典型的。

一个后果是语言中确实没有静态的概念。

你这样做的方式完全没问题,只要你不介意另一个对象可以直接读取和修改属性。

于 2012-07-12T22:54:19.227 回答
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

这可以被认为是一种更好的方法的一个原因是它完全隐藏了静态变量。如果您这样做myObject.count.staticCounter,其他一些代码可能正在读取或写入该变量。显然,您不希望这种情况发生,但如果您这样做,则完全可以保证该变量的范围,这会导致将来更容易调试和重构。

于 2012-07-12T23:04:06.050 回答