window 是 Javascript 中单例对象的例子吗?
Is window example of Singleton objects in Javascript?
在阅读此 article 时,我想将其与一些实际示例联系起来,所以我对 window
对象感到好奇。由于我们无法实例化它,并且在任何程序的生命周期中它只有一个实例,因此它应该满足条件。
以上是我的看法,但我想知道真相,而且给定文章中所说的所有观点都适用于一般的window
对象吗?
更新1
正如给定文章中引用的那样:
Singletons are nothing more than global state
所以,一般来说,全局状态通过隐藏依赖关系使测试变得更加困难,我们如何处理 javascript 中的此类限制?
它不是真正的单例,因为你可以用Window.open
函数创建一个新的实例。 return 值是对新 window 中脚本中相同对象脚本的引用,将被视为它们的全局 window
对象。
我要澄清的是,单例是 一种 全局状态,但它不是唯一的一种。的确,在当前 window
对象上定义的任何内容在脚本中的任何位置都是可见的。所以 window
直接代表你的全局状态,即使它在技术上不是 Singleton
.
现在,关于您的第二个问题,您如何处理 JavaScript 在测试期间具有全局范围的事实?好吧,这要难得多。即使在没有 window
对象的环境中,像 Node.js, there it still some set of global objects. Things like enabling 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 等一些静态分析工具可以帮助捕获这些类型的错误。
在阅读此 article 时,我想将其与一些实际示例联系起来,所以我对 window
对象感到好奇。由于我们无法实例化它,并且在任何程序的生命周期中它只有一个实例,因此它应该满足条件。
以上是我的看法,但我想知道真相,而且给定文章中所说的所有观点都适用于一般的window
对象吗?
更新1
正如给定文章中引用的那样:
Singletons are nothing more than global state
所以,一般来说,全局状态通过隐藏依赖关系使测试变得更加困难,我们如何处理 javascript 中的此类限制?
它不是真正的单例,因为你可以用Window.open
函数创建一个新的实例。 return 值是对新 window 中脚本中相同对象脚本的引用,将被视为它们的全局 window
对象。
我要澄清的是,单例是 一种 全局状态,但它不是唯一的一种。的确,在当前 window
对象上定义的任何内容在脚本中的任何位置都是可见的。所以 window
直接代表你的全局状态,即使它在技术上不是 Singleton
.
现在,关于您的第二个问题,您如何处理 JavaScript 在测试期间具有全局范围的事实?好吧,这要难得多。即使在没有 window
对象的环境中,像 Node.js, there it still some set of global objects. Things like enabling 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 等一些静态分析工具可以帮助捕获这些类型的错误。