1、創建了一個空的js對象(即{})
2、將空對象的原型prototype指向構造函數的原型
3、將空對象作為構造函數的上下文(改變this指向)
4、對構造函數有返回值的判斷
function create(Con,...args){ //1、創建一個空的對象 let obj = {}; // let obj = Object.create({}); //2、將空對象的原型prototype指向構造函數的原型 Object.setPrototypeOf(obj,Con.prototype); // obj.__proto__ = Con.prototype //3、改變構造函數的上下文(this),並將剩余的參數傳入 let result = Con.apply(obj,args); //4、在構造函數有返回值的情況進行判斷 return result instanceof Object?result:obj; }
在new的時候,會對構造函數的返回值做一些判斷:
1、如果返回值是基礎數據類型,則忽略返回值;
2、如果返回值是引用數據類型,則使用return 的返回,也就是new操作符無效;
1.var obj= {},創建了一個空對象obj{},也就是開辟了一塊內存地址,新建了一個對象實例(我是這樣認為的,如果有不對的歡迎指出);
2.obj.__proto__ = Person.prototype; 將 lisi 這個空對象的__proto__指向Person的prototype,也就是設置原型鏈;
3.var result = Person.call(obj),改變this的指向,讓this指向obj對象;
4.判斷Person的返回值類型,如果是引用類型,則返回這個引用類型的對象,如果是普通值類型,就返回obj;