【发布时间】:2012-05-16 08:48:34
【问题描述】:
我在 js 中有一个名为 Foo 的“类”(函数)来创建对象。由于它使用非常频繁,我希望它避免在创建新实例时使用new 关键字:Foo(something); 而不是new Foo(something);。
我让它在 Firefox 中工作:
function Foo(arg) {
if (this instanceof Window)
return new Foo(arg);
//Object construction here.
this.bar = "Hello " + arg;
}
现在我可以通过将其作为函数调用来创建 Foo 的实例。
console.log(Foo("World").bar); //Output "Hello World" in console.
虽然这在 FF 中有效,但在 Chrome 中却没有,我还不敢测试 IE。
chrome 中的问题是 window 在 chrome 中确实是 DOMWindow 类型
Uncaught ReferenceError: Window is not defined
而 this instanceof DOMWindow 在 chrome 中不起作用,因为出于某种原因它给出了:
ReferenceError: DOMWindow is not defined
我也尝试过使用!(this instanceof Foo) 和typeof this 似乎总是给"object"。
如何可靠地检测在所有浏览器上调用 Foo 时是否省略了 new 关键字?
更新:!(this instanceof Foo) 确实有效,我只是在我真正的 Foo 函数中有一个流浪的 return this。
【问题讨论】:
-
使用
!(this instanceof Foo)对我有用(Mac 上的 Chrome、Safari、Firefox)。该代码:function Foo() { console.log(this instanceof Foo) }将记录false用于在上述浏览器中执行Foo()和true用于new Foo()。 -
@ZER0 是的,我刚刚意识到我的函数中有一个杂散的
return this阻止它工作。
标签: javascript oop google-chrome object v8