如何实施JavaScript构造函数?

时间:2015-11-06 14:45:17

标签: javascript

我有以下构造函数:

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

现在,如果我说:

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

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

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

这将导致在name对象上定义agewindow

我的问题是,有没有办法阻止用户在没有Person的情况下直接调用new,从而不允许window对象被扩充?

4 个答案:

答案 0 :(得分:3)

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

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

了解详情:New/Scope Safe Constructors in OO JavaScript

答案 1 :(得分:2)

您可以明确测试条件:

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

答案 2 :(得分:1)

请参阅Can I construct a JavaScript object without using the new keyword?

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

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

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

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

答案 3 :(得分:0)

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