javascript强制开发人员使用new关键字进行实例化

时间:2015-03-05 13:34:06

标签: javascript function

Javascript中是否有任何方法可以强制开发人员使用new关键字创建新对象?

我知道每次执行此操作时javascript都会创建一个新对象:

var module=function(){}
var module = new module();

2 个答案:

答案 0 :(得分:5)

您可以检查当前this对象是当前构造函数的实例,如下所示

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

然后,您可以检查在没有new的情况下创建的对象是否为Person类型,如此

console.log(Person("thefourtheye") instanceof Person);
# true

或者,如果您希望开发人员明确使用new,那么您可以像Quentin建议的那样抛出错误,就像这样

function Person(name) {
    if (!(this instanceof Person)) {
        throw new Error("Person should be created with `new`")
    }
    this.name = name;
}

Person("thefourtheye");

将给出

/home/thefourtheye/Desktop/Test.js:3
        throw new Error("Person should be created with `new`")
              ^
Error: Person should be created with `new`
    at Person (/home/thefourtheye/Desktop/Test.js:3:15)

答案 1 :(得分:0)

ECMAScript 6 中,由于new,您可以检查new.target关键字的使用情况。除IE之外的所有浏览器均支持。

  

通过new.target属性,您可以检测是否使用new运算符调用了函数或构造函数。 在用new运算符实例化的构造函数和函数中,new.target返回对构造函数或函数的引用。在正常的函数调用中,new.target是未定义的

Developer Mozilla documentation

看看下面的例子:

function myconstructor() {
    if (!new.target) throw new Error('Constructor must be called using "new" keyword');
    return this;
}

let a = new myconstructor(); // OK
let b = myconstructor(); // ERROR