1.看一下正常使用的new方法函數
function father(name){ this.name=name; this.sayname=function(){ console.log(this.name) } } var son=new father('kimi') dog.sayname();
輸出結果:this
kimi
2.手寫一個new方法spa
function father(name){ this.name=name; this.sayname=function(){ console.log(this.name) } } function myNew(ctx, ...args){ // ...args爲ES6展開符,也可使用arguments //先用Object建立一個空的對象 let obj=new Object(); //新對象會被執行prototype鏈接 obj.__proto__=ctx.prototype; //新對象和函數調用的this綁定起來 let res=ctx.call(obj,...args); //判斷函數返回值若是是null或者undefined則返回obj,不然就放回res return res instanceof Object?res:obj; } var son=myNew(father,'kimi') son.sayname();
輸出結果:prototype
kimi
3.總結:code
new一個對象的過程是:對象
1>建立一個空對象blog
2>對新對象進行[prototype]綁定(即son._proto_=father.prototype)io
3>新對象和函數調用的this會綁定起來console
4>執行構造函數中的方法function
5>若是函數沒有返回值則自動返回這個新對象