以前常常用的new運算符厘肮,一new就出來一個對象转砖,神奇的很恢筝,現(xiàn)在我們來看見這個new底層究竟干了些什么
一、解析new運算
new一個對象
function Test(name,age){
this.name = name;
this.age = age
this.method = function (){
return this.name +':'+ this.age;
}
}
var t1 = new Test('kuohao',21);
t1.method(); //輸出 'kuohao':21
使用了new這個運算符料睛,t1就成為了一個對象丐箩,也擁有了Test構(gòu)造函數(shù)的method方法,這個new方法究竟做了什么恤煞?
實際上new方法的后臺是這樣的
//var t1 = new Test('kuhao',21)
//new Test 相當(dāng)于以下代碼
function Test(name,age){
//新建了一個對象,this指向了新建的當(dāng)前對象
var t1 = {};
//讓this的原型對象繼承Test的原型對象屬性和方法屎勘。
t1.constructor.prototype = Test.prototype;
//將傳進來的參數(shù)賦給this的屬性
t1.name = name;
t1.age = age
t1.method = function (){
return this.name +':'+this.age;
};
//最后返回出這個t1對象
return t1;
}
或者可以使用call方法去理解 new Test 構(gòu)造
//后臺新建一個對象
var obj = {};
//讓對象實例的原型對象繼承Test構(gòu)造函數(shù)的原型屬性和方法
obj.__proto__ = Test.prototype
//使用call方法把Test構(gòu)造函數(shù)的實例屬性和方法都拿過來為已所用,即是繼承
Test.call(obj,'kuohao',21);
總結(jié)
我的個人理解就是new運算符將構(gòu)造函數(shù)實例化構(gòu)造對象居扒,事實上就是繼承了構(gòu)造函數(shù)的實例屬性實例方法和原型屬性和原型方法概漱,初始化了對象,對象是JavaScript中預(yù)定義的喜喂,但是可以讓我們?nèi)U展它瓤摧,實現(xiàn)更多的功能。