如何强制执行JavaScript构造函数

How to enforce a JavaScript constructor?

本文关键字:构造函数 JavaScript 强制执行      更新时间:2023-09-26

我有以下构造函数:

function Person(name, age) {
  this.name = name;
  this.age  = age;
}

现在如果我说:

var p = new Person("jon", 25);

它将创建一个Person的实例,但如果用户执行以下操作会怎样:

var p = Person("jon", 25);

这将导致在window对象上定义nameage

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

这里有一种使用范围安全构造函数的方法:

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

阅读更多:OO JavaScript 中的新/Scope安全构造函数

您可以显式测试条件:

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;
}

请参阅是否可以在不使用new关键字的情况下构造JavaScript对象?

这并不能阻止在没有new的情况下调用该函数,但使用或不使用new调用该函数都会产生相同的效果。


如果您希望函数只可构造(即new"可调用"),则必须查看ES6并声明一个类:

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

根据class语法创建的构造函数必须使用new进行调用。否则将引发错误。

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