通过构造函数 "new" 一个对象出来时, 如果忘记写这个 new, 那这个构造函数就不会返回一个实例对象, 而是会像普通函数一样执行. 下面是两种规避忘记写new时所引发的问题的方法:
1. 使用严格模式, 只需要在函数体内部第一行加一个单独的字符串: "use strict", 就可以在没有new时直接报错, 以此提前知道哪里有问题.
function Person(name){ "use strict" this.name = name; } var Lilei = Person("Lilei"); // Error
2. 在函数内部检测是否加 new, 如果没有, 那就返回一个带 new 的构造函数.
function Person(name){ if(!(this instanceof Person)) { return new Person(name); } this.name = name; } var Lilei = Person("Lilei"); Lilei.name; // "Lilei"
3. 使用new.target检测是否加new
function Person(name) { if(!new.target) return new Person(name); this.name = name; } var lilei = Person("Lilei"); lilei.name; // "Lilei"
注意, 第二种方法检测的是构造函数在调用时的this指向, 因为如果不加new, 那这里的this就指向window(严格模式下指向undefined), 因此可以通过this指向来判断是否有 new;
function isThisEqualWindow(){ return this; } isThisEqualWindow() === window; // true