面向?qū)ο缶幊?br>
“面向?qū)ο缶幊獭保∣bject Oriented Programming跟狱,縮寫為OOP)是目前主流的編程范式
雖然不同于傳統(tǒng)的面向?qū)ο缶幊陶Z言(java c++),但是JavaScript具有很強(qiáng)的面向?qū)ο缶幊棠芰?/p>
每一個對象都是功能中心,具有明確分工,可以完成接受信息、處理數(shù)據(jù)春瞬、發(fā)出信息等任務(wù)
面向?qū)ο缶幊叹哂徐`活性、代碼的可重用性莹汤、模塊性等特點(diǎn)快鱼,容易維護(hù)和開發(fā)颠印,非常適合多人合作的大型軟件項(xiàng)目
構(gòu)造函數(shù)
“面向?qū)ο缶幊獭钡牡谝徊礁倭耄褪且伞皩ο蟆?br>
JavaScript的對象體系,是基于構(gòu)造函數(shù)(constructor)和原型鏈(prototype)
JavaScript的面向?qū)ο缶幊袒凇霸蛯ο蟆?/p>
構(gòu)造函數(shù)的寫法就是一個普通的函數(shù)
var Vehicle = function () {
this.price = 1000;
};
上面代碼中线罕,Vehicle就是構(gòu)造函數(shù)止潮,它提供模板,用來生成對象實(shí)例
* 為了與普通函數(shù)區(qū)別钞楼,構(gòu)造函數(shù)名字的第一個字母通常大寫 (構(gòu)造函數(shù)的非硬性要求)
* 函數(shù)體內(nèi)部使用了this關(guān)鍵字喇闸,代表了所要生成的對象實(shí)例(構(gòu)造函數(shù)的硬性要求)
new 命令 [ new 構(gòu)造函數(shù)返回對象實(shí)例; new普通函數(shù)返回{}無new無實(shí)例 ]
new命令的作用,就是執(zhí)行構(gòu)造函數(shù)询件,返回一個實(shí)例對象
var Vehicle = function (){
this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
使用new命令時燃乍,根據(jù)需要,構(gòu)造函數(shù)也可以接受參數(shù)
var Vehicle = function (p) {
this.price = p;
};
var v = new Vehicle(500);
new命令本身就可以執(zhí)行構(gòu)造函數(shù)宛琅,所以后面的構(gòu)造函數(shù)可以帶括號刻蟹,也可以不帶括號
var v = new Vehicle();
var v = new Vehicle;
另一方面,如果對普通函數(shù)(內(nèi)部沒有this關(guān)鍵字的函數(shù))使用new命令嘿辟,則會返回一個空對象
function getMessage() {
return 'this is a message';
}
var msg = new getMessage();
msg // {}
typeof msg // "Object"
還有一方面舆瘪,如果沒有使用new命令,構(gòu)造函數(shù)就普通函數(shù)對待红伦,并不會生成對象實(shí)例
var Vehicle = function (){
this.price = 1000;// this指代Vehicle函數(shù)的調(diào)用者
};
var v = Vehicle();// v存著Vehicle函數(shù)的返回值undefined
v.price// Uncaught TypeError: Cannot read property 'price' of undefined
price// 1000
new命令的原理
使用new命令時英古,它后面的函數(shù)調(diào)用就不是正常的調(diào)用,而是依次執(zhí)行下面的步驟
1. 創(chuàng)建一個空對象
2. 將這個空對象的原型昙读,指向構(gòu)造函數(shù)的prototype屬性
3. 將這個空對象賦值給函數(shù)內(nèi)部的this關(guān)鍵字
4. 開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼
5. 返回this--即對象實(shí)例
也就是說構(gòu)造函數(shù)內(nèi)部召调,this指的是一個新生成的空對象,所有針對this的操作,都會發(fā)生在這個空對象上
構(gòu)造函數(shù)之所以叫“構(gòu)造函數(shù)”某残,就是說這個函數(shù)的目的国撵,就是操作一個空對象(即this對象),將其“構(gòu)造”為需要的樣子
構(gòu)造函數(shù)有return的情況
如果構(gòu)造函數(shù)內(nèi)部有return語句玻墅,而且 return語句返回的是一個跟this無關(guān)的新對象
new命令就會返回這個新對象介牙, 這一點(diǎn)需要特別引起注意
除此之外,就不會管return語句澳厢,直接返回this對象
var Vehicle = function (){
this.price = 1000;
return { price: 2000 };
};
new Vehicle()// 返回 Object {price: 2000}
var Vehicle = function () {
this.price = 1000;
return 1000;
};
new Vehicle()// 返回 this 指向所要生成對象實(shí)例
new.target(作為了解)
任何函數(shù)內(nèi)部都可以使用new.target屬性
如果當(dāng)前函數(shù)是new命令調(diào)用环础,new.target指向當(dāng)前函數(shù),否則為undefined剩拢。
function f() {
console.log(new.target === f);
}
new f() // true
f() // false