閱讀本文以前,您應該對原型鏈機制有所瞭解。segmentfault
1.new關鍵字會首先建立一個空對象
2.將這個空對象的原型對象指向構造函數的原型屬性,從而繼承原型上的方法
3.將this指向這個空對象,執行構造函數中的代碼,以獲取私有屬性
4.若是構造函數返回了一個對象res,就將該返回值res返回,若是返回值不是對象,就將建立的對象返回
理解了new的原理,手動實現就很簡單了.app
//由於new是關鍵字,我用函數的形式來實現,能夠將構造函數和構造函數的參數傳入 function myNew(Fn,...args){ //1.建立一個空對象,並將對象的__proto__指向構造函數的prototype 這裏我兩步一塊兒作了 const obj=Object.create(Fn.prototype); //2.將構造函數中的this指向obj,執行構造函數代碼,獲取返回值 const res=Fn.apply(obj,args); //3.判斷返回值類型 return res instanceof Object ?res:obj }
測試函數
//構造函數 function Person(name,sex){ this.name=name; this.sex=sex } Person.prototype.getName=function(){ return this.name } const zcy=new Person('zcy','男'); const forceddd=myNew(Person,'forceddd','男'); console.log(zcy); console.log(forceddd); console.log(zcy.getName()); //共享原型上的方法 console.log(zcy.getName===forceddd.getName);//true