0

一直在阅读Addy Osmani 的Javascript 设计模式,在文档中,这个简单的分配用于“防止覆盖已经存在的对象/命名空间”

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

所以我知道如果它已经存在,它会将相同的对象分配给变量,或者如果它(理想情况下)不存在则创建一个空对象。所以假设我向这个对象的原型添加了一个方法,但是一个已经存在的、同名的对象已经有一个同名的方法输出“嗨!”。以下应该发生,对吧?

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

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

4

2 回答 2

1

这个想法是,您可能有一个sayHello向.myNSsayGoodbyemyNS

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

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

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

于 2014-06-19T18:58:36.100 回答
1

这种分配形式的目的不是避免命名冲突,而是保留一个已经存在的对象。

例如,如果您有两段代码向对象添加属性或方法,并且您不知道其中哪一个先运行,或者无法控制,您可以让两者都使用这样的赋值:

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

和其他地方:

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

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


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

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

于 2014-06-19T19:10:11.530 回答