如何强制执行JavaScript构造函数?

如何强制执行JavaScript构造函数?,javascript,Javascript,我有以下构造函数: function Person(name, age) { this.name = name; this.age = age; } function Person(name, age) { if (this instanceof Person) { this.name = name; this.age = age; } else { return new Person(name ,age); } } 现在如果我说: var

我有以下构造函数:

function Person(name, age) {
  this.name = name;
  this.age  = age;
}
function Person(name, age) {
  if (this instanceof Person) {
    this.name = name;
    this.age = age;
  } 
  else {
    return new Person(name ,age);
  }
}
现在如果我说:

var p = new Person("jon", 25);
它将创建
Person
的实例,但如果用户执行以下操作,该怎么办:

var p = Person("jon", 25);
这将导致在
窗口
对象上定义
名称
年龄


我的问题是,有没有一种方法可以防止用户在没有
new
的情况下直接调用
Person
,从而不允许对
window
对象进行扩展?

您可以显式测试以下条件:

function Person(name, age) {
  if (!this || this === window)
    return new Person(name, age);
  this.name = name;
  this.age = age;
}
现在,这仍然不能阻止某人做类似的事情

var obj = {};
Person.call(obj, "John", 22);
您可以使用
instanceof
进行测试,如另一个答案所示,该答案处理该问题:

function Person(name, age) {
  if (!(this instanceof Person))
    return new Person(name, age);
  this.name = name;
  this.age = age;
}

下面是一种使用范围安全构造函数的方法:

function Person(name, age) {
  this.name = name;
  this.age  = age;
}
function Person(name, age) {
  if (this instanceof Person) {
    this.name = name;
    this.age = age;
  } 
  else {
    return new Person(name ,age);
  }
}
阅读更多信息:

请参阅

这不会阻止在不使用
new
的情况下调用函数,但是在使用或不使用
new
的情况下调用函数将具有相同的效果


如果您只希望函数是可构造的(即使用
new
“callable”),则必须查看ES6并声明一个类:

class Person {
  constructor() {
    // ...
  }
}

语法创建的构造函数必须使用
new
调用。否则会抛出错误。

这是很酷的东西,活生生的学习:)你不能测试(!(这个人的实例))吗?因此,这可以防止一切发生?@Strandkid使用
instanceof
进行测试是最好的做法-我应该编辑答案。这基本上是正确的,但请参阅下面我的测试,以获得更简单的形式
function Person(name ,age){
    if ( ! (this instanceof Person) ) {
        return new Person(name, age);
    }
    this.name = name;
    this.age  = age;
}