昨天面试的时候,遇到了一个问题,ES6中的class不使用new就会报错,请问你如何用ES5的构造函数实现同样的效果。
当时我是一脸懵逼的,面试结束后,自己一直在思考这个问题,仔细想了想new的整个过程
function myNew(fn){
let O = Object.create(fn.prototype);
let S = fn.apply(O);
return typeof S === 'object' ? S : O;
}
那么是否使用new来调用构造函数的区别在于哪里?
我们可以看到,在使用new时,有一个 fn.apply(O);
这就是解决这道题的关键点,我们可以在构造函数的内部,去判断当前的this的指向。我们知道,默认情况下,函数内部的this的指向是指向window或者undefined的。所以,我们可以这样来实现:
function myClass(){
try{
if( this.__proto__ !== myClass.prototype ){
throw Error("No New");
}
}catch(e){
console.err(e);
}
}
如此,我们就实现了构造函数不使用new来调用,其就会报错的功能。