var myObj = myObj ||有什么好处{}当myObj已经存在?

时间:2014-06-19 18:53:41

标签: javascript namespaces variable-assignment name-collision

从Addy Osmani阅读 Javascript设计模式,在文档中,这个简单的赋值用于'防止覆盖已存在的对象/命名空间'

var myNS = myNS || function() {};

所以我理解它为变量分配了相同的对象(如果它已经存在),或者如果它(理想情况下)不存在则创建一个空对象。因此,假设我为此对象的原型添加了一个方法,但是已经存在的,类似命名的对象已经有一个类似命名的方法,输出'Hi!'。以下情况应该发生,对吧?

myNS.prototype.sayHello = function() { return 'Hello!' }; 
myNS.sayHello(); // Hello! ??

原来的myNS.sayHello() // Hi!仍然被覆盖,不是吗?那么,在这种情况下,条件变量赋值是做什么的,除了添加一级名称冲突避免?或者我完全错了吗?

2 个答案:

答案 0 :(得分:1)

我们的想法是,您可能会有一个脚本向sayHello添加myNS功能,以及向sayGoodbye添加myNS功能的其他脚本。

在每个脚本中使用var myNS = myNS || {};模式意味着您可以:

  • 加载其中一个脚本而不尝试写入不存在的对象
  • 以任意顺序加载两个脚本,而第二个脚本不会破坏第一个

它不提供保护,防止两个脚本覆盖对象的相同方法。

答案 1 :(得分:1)

这种转让形式的目的不是为了避免命名冲突,而是要保留已经存在的对象。

例如,如果您有两段代码可以向对象添加属性或方法,并且您不知道它们中的哪一个先运行,或者无法控制它,那么您可以同时使用这两个代码使用这样的作业:

var myNS = myNS || {};
myNS.doSomething = function(){ ... };

以及其他地方:

var myNS = myNS || {};
myNS.doSomethingElse = function() { ... };

当两个代码都运行时,你有一个具有两种方法的对象,并且这两个代码都不依赖于另一个代码存在或按特定顺序执行。


如果你想要一个新对象,你应该只创建一个新对象。

如果您只想避免命名冲突,那么您应该将代码保留在函数范围内,以便所有变量都是该范围的本地变量,并且将覆盖全局范围内具有相同名称的任何变量。许多图书馆使用这种方法尽可能少地放在可能干扰其他图书馆的全球范围内。