2014-02-25 42 views
3

我已经在供应商代码的对象构造看到这个测试:对象的构造:测试,如果这是}这种对象

function MyObject() { 
    if (!(this instanceof MyObject)) return new MyObject; 
    ... 
} 

我的第一个倾向是,这个测试是用来防止绑定到另一个this值时调用构造函数。但是,我想在这里检查是否有其他的东西丢失。有人可以解释这个测试的确切意图吗?

回答

7

这项测试是为了确保MyObject总是作为一个构造函数,即:

var instance = new MyObject(); 

永不

var instance = MyObject(); 

这将导致代码的不受欢迎的行为。

如果有人不小心使用var instance = MyObject();形式则this里面的功能将是一个全局对象(窗口)和instanceof检查将迫使适当的构造函数调用在这种情况下。

但有些人认为这种模式有害,因为它修复了开发者的错误。在这种情况下,我会亲自抛出一个异常,而不是让粗心的开发人员像一切都好起来一样。

+1

很好的答案!并且100%同意这应该抛出一个例外,而不是抱着粗心大意的开发者的手。 – srquinn

+0

应该补充的是,这主要在nodejs模块中看到,其中模块的'export'的值可以是多种不同的东西,而不仅仅是一个对象构造函数。有了这个说法,文档和抛出异常仍然是优先于“修复”开发人员的代码。我认为隐含的构建会导致更严重的代码滥用,而不是正在试图阻止的测试。 – srquinn