new關鍵字主要的作用是繼承
當一個構造函數(shù)前加上new的時候,背地里來做了四件事:
1.生成一個空的對象并將其作為 this;
2.將空對象的 proto 指向構造函數(shù)的 prototype;
3.運行該構造函數(shù);
4.如果構造函數(shù)沒有 return 或者 return 一個返回 this 值是基本類型,則返回this;如果 return 一個引用類型,則返回這個引用類型。
對應偽代碼:
對于const a = new Foo();,new干了以下事情
const o = new Object();//創(chuàng)建了一個新的空對象o
o.__proto__ = Foo.prototype;//讓這個o對象的` __proto__`指向函數(shù)的原型`prototype`
Foo.call(o);//this指向o對象
a = o;//將o對象賦給a對象
new一共經歷4個階段
1、創(chuàng)建一個空對象
var obj = new Object();
2、設置原型鏈
此時便建立了obj對象的原型鏈
obj._proto_ = Object.prototype;
3、讓Func的this指向obj,并執(zhí)行Func函數(shù)體
Object.call(obj);
4、判斷Func(構造函數(shù))的返回值類型
return typeof result === 'object'? result : obj;
構造函數(shù)默認return this,不用寫,如下
function A(){
this.name = x;
// return this;
}
如果構造函數(shù)return是基本數(shù)據(jù)類型:
return 1
return "abc"
則return 后的東西忽略,就是return {}
如果是return的是引用類型:
則以return的內容為準
function A(){
this.name = x; // 無效
return {a: 1};
}