Javascript:使用“模块模式”引用变量,任何想法?

时间:2014-08-03 15:37:57

标签: javascript oop

好的,所以我有一个名为" SelectorsModule"的模块。在其中,我有一个对象文字,它将包含将在各种用户交互期间在应用程序中使用的所有jQuery选择器(见下文)

为了在每次使用选择器时停止重复相同的$(选择器)代码,我认为将所有共享选择器元素放入其自己的SelectorsModule'中会更有效。这样,如果需要进行任何更改,只需要在一个地方进行修改,一切都可以正常工作。然后也可以从一个地方调用每个选择器,即。 " SelectorsModule.getSelectors.selectorTwo",例如。

var SelectorsModule = SelectorsModule || {};

SelectorsModule = (function(){

    // Private methods and variables
    var sharedSelectors = {
        selectorOne:            $("#element-one"),
        selectorTwo:            $("#element-two"),
        selectorThree:          $("#element-three"),
        selectorFour:           $("#element-four")
    };

    // Public methods and variables
    return{

        getSelectors: function(){
            return sharedSelectors;
        }
    };

})();

我的问题:

  1. 每次我在代码中使用SelectorsModule.getSelectors.selectorOne(获取jQuery选择器对象)时,我只是引用首次运行脚本时创建的SelectorsModule的单个实例,或者是每次在幕后创建的新SelectorsModule'对象?后者显然会表现得更糟,真的需要澄清吗?

  2. 我目前的做法是错误的,匆匆的,好的,好的,完美的还是很好的?

2 个答案:

答案 0 :(得分:1)

1)您使用最初创建的模块的相同实例。

2)对我来说似乎完全没问题。

答案 1 :(得分:0)

(1)每次致电

 SelectorsModule.getSelectors().selectorOne // note the parentheses for invocation

您正在访问代码首次运行时创建的同一单例对象。

(2)我会说没关系,但我会有两个问题:

(a)这些选择器是否属于一个单独的对象,或者某些对象/行为和其他行为适用于其他区域?这纯粹是意见,但它们可能更好地封装在作用于它们的对象中。

(b)请记住,在实例化SelectorsModule时,jQuery函数只会为每个选择器调用一次。这意味着,如果您在实例化模块后修改DOM,则任何更改都不会反映在模块属性返回的jQuery对象中。

最后,作为旁注,在属性名称中使用术语“选择器”会有点混乱(尽管我怀疑这只是出于问题的目的)。传递给jQuery函数的字符串是一个'selector',但属性本身每个都包含'一个jQuery对象',而不是严格意义上的选择器。