在JavaScript函数中,我怎么知道我是否用new调用了?

时间:2015-07-15 23:34:41

标签: javascript

如果我有功能:

function Thing( name_of_thing )
{
    this.name = name_of_thing;
}

有没有办法知道是否通过以下方式调用:

var my_thing = new Thing( 'Something' ); // result: { name: "Something" }

var my_thing = Thing( 'Something' ); // result: undefined

1 个答案:

答案 0 :(得分:3)

尝试这样的事情:

function Thing(nameOfThing) {
  if (this == window) throw new Error("Must be constructed with new!");
  this.name = nameOfThing;
}

var myThing = new Thing("Something"); // Thing {name: "Something"}
var myThing = Thing("Something"); // error

基本上我们将this与全局window对象进行比较。如果它们是相同的(因此==),那么如果它们是相同的则抛出错误。

您还可以通过检查thisThing的实例来解决问题:

function Thing(nameOfThing) {
  if (!(this instanceof Thing)) throw new Error("Must be instance of Thing!");
  this.name = nameOfThing;
}

这稍微好一些,因为它只允许Thing的任何实例或Thing子类的实例。

你记得记住这一点是个好主意,因为否则你将设置window的属性 - 所以window.name将是"Something"!< / p>