javascript - 带有命名空间的 JavaScript 匿名函数的好处

标签 javascript

编写这样的 JavaScript 类和命名空间有什么好处吗...

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

(function(){
MyNamespace.MyClass = function(){
    this.property = 'foo'

    return this;
}
}());

与仅此相比...

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

MyNamespace.MyClass = function(){
    this.property = 'foo'

    return this;
}

我已经在几个库中看到了第一个模式的实现,并且试图找出是否有任何额外的好处,除非在第一个示例中的匿名函数内部声明了某种其他函数。

最佳答案

针对您的问题:

是的,有区别(和好处)。在您的第一个示例中,您可以控制访问控制(意味着使用基于原型(prototype)的公共(public)/私有(private)成员变量和函数版本)。例如:

var m = (function() {
    var o = {};
    o.myPublicProperty = 0; // can be accessed by instantiated object's calling code

    var myPrivateProperty = 1; // can't be accessed outside of this module

    o.myPublicFunction = function() {
        myPrivateFunction();
        return myPrivateProperty;
    };

    function myPrivateFunction() {
        ++myPrivateProperty;
        ++o.myPublicProperty;
    }

    o.getMyPrivateProperty = function() {
        return myPrivateProperty;
    }

    return o;
})();

console.log(m.myPublicProperty);       // 0
console.log(m.getMyPrivateProperty()); // 1
console.log(m.myPrivateProperty);      // undefined
console.log(m.myPublicFunction());     // increments
console.log(m.myPublicProperty);       // 1
console.log(m.getMyPrivateProperty()); // 2

http://jsfiddle.net/dbrecht/EQ4Tb/

有点跑题了,但这对我来说有点奇怪:

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

为什么不直接使用:var MyNamespace = MyNamespace || {};?

关于javascript - 带有命名空间的 JavaScript 匿名函数的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174172/

相关文章:

javascript - 从变量中获取 `/`之后的值

javascript - dotdotdot 省略号不适用于 flexslider 标题

javascript - 防止 .mouseout 事件执行

javascript - Firefox Safari chrome 等 window.createPopup() 的等价物是什么

javascript - 减少由 ui-grid 或替代网格解决方案创建的监视

java - Selenium 将文本框视为隐藏,即使我可以在浏览器中看到它

javascript - 如何根据对象的任何一个属性对对象数组进行排序

javascript - 无法使变量与从 localStorage [Vuejs] 检索到的另一个变量相等

javascript - 如何声明一组匹配文件的导出类型?

javascript - 如何保存 html Canvas 然后在不丢失形状的情况下重新加载它?