在Javascript中是Singleton对象的窗口示例吗?

时间:2016-04-15 18:53:43

标签: javascript oop dom singleton tdd

在阅读此article时,我想将此与一些实际例子联系起来,所以我对window对象感到好奇。由于我们无法实例化它,并且它在任何程序的生命周期中只有一个实例,因此它应该满足标准。

以上是我的意见,但我想知道真相,而且,给定文章中所说的所有要点一般都适用于window对象?

UPDATE1

引用文章引用:

  

单身人士只不过是全球状态

因此,一般来说,全局状态通过隐藏依赖关系使测试变得更难,我们如何在javascript中处理这些限制?

1 个答案:

答案 0 :(得分:3)

它不是真正的单例,因为您可以使用Window.open函数创建新实例。返回值是对该脚本中相同对象脚本的引用,该新脚本中的脚本将被视为其全局window对象。

我会澄清单身人士是全球状态的一种,但并不是唯一的一种。确实,当前window对象上定义的任何内容都可以在脚本中的任何位置看到。因此window直接表示您的全局状态,即使它在技术上不是Singleton

现在,关于您的第二个问题,您如何处理JavaScript在测试期间具有全局范围的事实?那太难了。即使在没有window对象的环境中,例如Node.js,它仍然存在一些全局对象。启用strict mode这样的事情可以大大避免在全局范围内意外创建变量,并且您可以阻止函数添加到这样的全局状态(我不确定这是否可取,但它的确有效):

"use strict"
Object.preventExtensions(window);

function testfunc() {
  window.someVar = 0; // Can't add property x, object is not extensible
  console.log("testfunc", window.someVar);
}

但我认为你不能完全消除全局状态影响代码的可能性。一个常见的例子是window.name属性,它可以出现在意想不到的地方,如:

"use strict"
Object.preventExtensions(window);

function testfunc() {
  console.log("testfunc", name); // perfectly valid
}

某些静态分析工具(如JSLint)可以帮助捕获这些类型的错误。