通过构造函数 "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

 

评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!