JavaScript new的運行過程
參考 MDN網站的運算符
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new
new 運算符創建一個用戶定義的對象類型的實例或具有構造函數的內置對象的實例。new 關鍵字會進行如下的操作:
1)創建一個空的簡單JavaScript對象(即{});
2)鏈接該對象(即設置該對象的構造函數)到另一個對象 ;
3)將步驟1新創建的對象作為this的上下文 ;
4)如果該函數沒有返回對象,則返回this。
復現代碼如下:
1 <script type="text/javascript"> 2 function Person(name,age){ 3 this.name=name; 4 this.age=age; 5 //return this; 6 } 7 Person.prototype.say=function(sth){ 8 console.log('I Say:'+sth); 9 }; 10 11 function _new(){ 12 //創建一個簡單的空對象 13 var obj={}; 14 //獲取構造函數 15 var _Constructor=arguments[0]; 16 //鏈接到原型 17 obj=Object.create(_Constructor.prototype);//obj.__proto__=_Constructor.prototype;__proto__不推薦使用 見https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/proto 18 19 //獲取構造函數的參數列表的值 20 var _args=Array.prototype.slice.call(arguments,1); 21 //將構造函數綁定到this值(result值) 22 var result = _Constructor.apply(obj,_args); 23 //判斷構造函數是否return非構造函數this的值,若是非對象則忽略返回構造函數this值,若是對象則返回構造函數return的對象 24 return typeof result === "object" ? result : obj;//如果返回值是一個對象就返回該對象,否則返回構造函數的一個實例對象 25 }; 26 var newPerson=new Person('orgin',1); 27 var _newPerson=_new(Person,'my',2); 28 29 console.log(newPerson); 30 console.log(_newPerson); 31 32 var newPerson2=new Person; 33 var _newPerson2=_new(Person); 34 console.log(newPerson2); 35 console.log(_newPerson2); 36 </script>

浙公網安備 33010602011771號