ES6中的Class不用new就報錯的實現

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章