怎样解决忘加new关键字所造成的问题

通过构造函数 "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
原文地址:https://www.cnblogs.com/aisowe/p/11652754.html