Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象构造:测试这是否是对象的实例_Javascript_Node.js_Ecmascript 5 - Fatal编程技术网

Javascript 对象构造:测试这是否是对象的实例

Javascript 对象构造:测试这是否是对象的实例,javascript,node.js,ecmascript-5,Javascript,Node.js,Ecmascript 5,我在供应商代码的对象构造函数中看到了这个测试: function MyObject() { if (!(this instanceof MyObject)) return new MyObject; ... } 我的第一个倾向是,在调用构造函数时,此测试用于防止绑定到另一个this值。不过,我想在这里检查一下,以防我还遗漏了一些东西。有人能解释一下这个测试的确切目的吗?这个测试是为了确保MyObject始终被用作构造函数,即: var instance = new MyObject()

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

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

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

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

var instance = new MyObject();
永远不会

var instance = MyObject();
这将导致代码出现不必要的行为

如果有人意外地使用了
var instance=MyObject()
form然后
函数内部将是一个全局对象(窗口),在这种情况下,
instanceof
检查将强制正确调用构造函数


有些人认为这种模式有害,因为它会纠正开发人员的错误。在这种情况下,我个人会抛出一个例外,而不是让粗心的开发人员觉得一切正常。

回答得很好!100%的人认为这应该引发异常,而不是抓住粗心的开发人员的手。应该补充的是,这主要出现在nodejs模块中,其中模块的导出值可以是许多不同的东西,而不仅仅是对象构造函数。尽管如此,文档和抛出异常仍然优先于为开发人员“修复”代码。我认为隐含的构造将导致对代码的更严重的滥用,而不是相关测试试图阻止的。