【问题标题】:Within a JavaScript function how do I know if I was invoked with new? [duplicate]在 JavaScript 函数中,我如何知道我是否被 new 调用? [复制]
【发布时间】:2015-07-15 23:34:40
【问题描述】:

如果我有功能:

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

【问题讨论】:

  • 是的。问题是:你什么时候想知道?

标签: javascript


【解决方案1】:

试试这样的:

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 对象进行比较。如果它们相同(因此==),那么如果它们相同则抛出错误。


您还可以通过检查 this 是否是 Thing 的实例来判断:

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

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


记住这一点是个好主意,否则您将设置window 的属性 - 所以window.name 将是"Something"

【讨论】:

  • @whatwasthat 我认为应该避免这种防御性编程。使用工具来控制代码质量,例如 jshint 会自动警告这些错误。
猜你喜欢
  • 2023-01-27
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多