乐趣区

你不知道的newtarget

前几天在复看 es6 的时候看到这个东西(new.target), 个人觉得挺好的,然后想跟大家分享一下

什么是 new.targer?它有什么用?它能干什么?

  • new.target 是 es6 新增加的一个东西,它返回的是某个构造函数或者是 undefined。
  • new.target 可以判断构造函数是 new 实例化的还是直接调用的,如果是通过 new 实例化的,会返回这个构造函数,如果直接调用的,返回的就是 undefined。
  • 如果通过 es5 写构造函数的时候,可以通过 new.target 返回的值,确保构造函数是通过 new 实例化,而不是直接调用;如果通过 es6 写构造类的时候,也可以通过 new.target 返回的值,确保祖先类只能被继承,不猛被实例化。

es5

function Person(name){if(new.target === undefined){throw new Error("必须通过 new 来实例化")
        }
        this.name = name;
    }
        // 如果不通过 new 实例化的话, 直接报错
        var Jack =  Person("su")

es6(这里说一下,Person 被继承之后,new.target 不再指向 Peoson, 会指向子类的构造函数)

class Person{constructor(name) {if(new.target === Person){throw new Error("该类只能继承不能被实例化")
        }
        this.name = name
    }
}
// Person 实例化直接报错
class July extends Person{constructor(name,age){super(name),
        this.age = age                
}
    eat(){console.log(this.age,this.name)
    }
}
var Jack = new July("su",21)

——end——

退出移动版