【问题标题】:Patterns for avoiding name-space pollution避免命名空间污染的模式
【发布时间】:2015-03-05 19:58:19
【问题描述】:

This 文章描述了一些避免命名空间污染的模式。我列出了下面的模式以及文章中给出的部分示例代码。

我的问题是:有没有普遍接受的“最佳”方式?为我的项目选择一种时有哪些注意事项?

直接分配

var myApp = {}
myApp.id = 0;
myApp.next = function() {
    return myApp.id++;  
}

使用对象文字符号

var myApp = {
    id: 0,
    next: function() {
        return this.id++;   
    }
}

模块模式

var myApp = (function() {
    var id= 0;
    return {
        next: function() {
            return id++;    
        },
    };  
})();  

命名空间参数

var myApp = {};
(function(context) { 
    var id = 0;
    context.next = function() {
        return id++;    
    };
 })(myApp);  

这是一个命名空间代理

var myApp = {};
(function() {
    var id = 0;
    this.next = function() {
        return id++;    
    };
    this.reset = function() {
        id = 0;     
    }
}).apply(myApp);   

我目前使用的方法

我在自己的项目中使用了以下方法。不好吗?

function MyObj(){
    this.someProperty = 'something';
}
MyObj.prototype.someFunction = function(){
    this.someProperty =5;
}
myApp = new MyObj();

【问题讨论】:

  • 好吧,您正在创建 两个 全局符号而不是一个,所以如果您认为这很糟糕,那就太糟糕了。

标签: javascript design-patterns namespaces global


【解决方案1】:

没有公认的最佳方法。对不起。

正如 Pointy 所说,您的方法涉及创建 MyObj 构造函数,该构造函数可能永远不会再次使用,以及 myApp 命名空间对象。它至少还有一个小缺点:您不能阻止自己或其他人使用该代码再次调用MyObj,这对于应该是您的命名空间的东西来说很奇怪。

任何基于 IIFE 的解决方案都应该可以正常工作,而且它们大多可以互换。模块(或显示模块)可以说是最简单的。命名空间参数允许您将模块拆分为多个文件,我选择永远不会这样做,但如果这是您想要的,它可能会很有用。我看不出“this as a Namespace Proxy”方法有什么真正的优势。

【讨论】:

  • 我喜欢命名空间参数模式,但我有一个问题。在我使用的方法中,我可以通过 myObj1 = new MyObj(); myObj2 = new MyObj(); 实例化多个对象,并且所有对象将共享相同的函数,因为它们绑定到同一个原型对象。如何通过参数模式使用命名空间实例化多个对象,其中每个对象共享相同的方法?
  • 实际上,关键在于您不会这样做。通常使用的命名空间是单数的。这才是重点。如果您正在寻找一般的对象构造模式,那么这不是正确的选项列表。然后你可以像你提到的那样做简单的原型工作,使用Object.create,为此选择众多帮助库之一,或者只是search for javascript对象创建模式。
  • 谢谢。我显然混淆了两件事。所以我想如果你把它们结合起来,你会得到这个:link。如果你想重用一个不使用命名空间参数模式的组件,那么你只需在所有函数和变量引用之前删除命名空间。似乎是一个很好的解决方案。
  • 是的,当然,您可以在您的命名空间代码块使用各种模式,包括这个原型 OO 模式。
猜你喜欢
  • 2020-01-03
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2010-12-22
  • 2011-06-04
  • 1970-01-01
相关资源
最近更新 更多