昨天面試的時候,遇到了一個問題,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來調用,其就會報錯的功能。