【问题标题】:Object construction: test if this is instanceOf Object对象构造:测试这是否是 instanceOf Object
【发布时间】:2014-02-25 14:55:01
【问题描述】:

我在供应商代码的对象构造函数中看到了这个测试:

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

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

【问题讨论】:

    标签: javascript node.js ecmascript-5


    【解决方案1】:

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

    var instance = new MyObject();
    

    永远不会

    var instance = MyObject();
    

    这会导致代码的不良行为。

    如果有人不小心使用了var instance = MyObject(); 形式,那么函数内部的this 将是一个全局对象(Window),instanceof 在这种情况下会强制调用正确的构造函数。

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

    【讨论】:

    • 很好的答案!并且 100% 同意这应该引发异常,而不是牵着粗心的开发人员的手。
    • 应该补充一点,这主要出现在 nodejs 模块中,其中模块的 export 的值可以是许多不同的东西,而不仅仅是一个对象构造函数。话虽如此,文档和抛出异常仍然优先于为开发人员“修复”代码。我认为,隐含的构造将导致对代码的更严重的滥用,而不是所讨论的测试试图防止的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多