您好,登錄后才能下訂單哦!
繼承是OOP中大家最喜歡談?wù)摰膬?nèi)容之一,一般來說,繼承都兩種方式:接口繼承和實(shí)現(xiàn)繼承而JavaScript中沒有接口繼承需要的方法,因此只能依靠實(shí)現(xiàn)繼承。
在講繼承的實(shí)現(xiàn)之前,我們首先來回顧一下什么是繼承?繼承的作用是什么?
它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
通過繼承創(chuàng)建的新類稱為“子類”或“派生類”。
被繼承的類稱為“基類”、“父類”或“超類”。
在清楚繼承的作用之后,下面我們來探討一下JS中的幾種繼承實(shí)現(xiàn)的方式:
//混入式繼承(拷貝)//obj2繼承到obj1中的成員,可以直接將obj1中的成員拷貝到obj2中即可var obj1 = {name:"zs",age:10};var obj2 = {};// 將obj1中的成員拷貝到obj2中for (var key in obj1) {
obj2[key] = obj1[key];
}console.log(obj1);console.log(obj2);
最終得到的obj2中的成員和obj1中的成員完全一致,當(dāng)然,我們需要清除的是,此時(shí)的obj1和obj2是兩個(gè)不同的對(duì)象。
混入式繼承方式看似很簡單,但是存在共享數(shù)據(jù)安全的問題。
var obj1 = {name:"zs",age:10,car:{name:"mini"}};var obj2 = {};// 將obj1中的成員拷貝到obj2中for (var key in obj1) {
obj2[key] = obj1[key];
}//修改obj1對(duì)象中的car屬性
obj1.car.name = "bus";
console.log(obj1);console.log(obj2);
當(dāng)我們需要修改某些對(duì)象中的引用類型對(duì)象的時(shí)候,會(huì)造成其他相關(guān)的對(duì)象也被修改,這是我們不希望看到的。
原型式繼承的實(shí)現(xiàn)
回想一下,當(dāng)我們在訪問一個(gè)對(duì)象中的成員的時(shí)候,首先是在當(dāng)前對(duì)象中查找,如果找不到,就往上,在原型鏈中依次查找,如果在整個(gè)原型鏈中也不存在該成員,那么就返回undefined。
所以,我們想要在A對(duì)象中訪問到B對(duì)象中的成員,除了將B中的成員添加到A中,如:混入式,我們也可以考慮將B中成員添加到A的原型鏈中,實(shí)現(xiàn)對(duì)象成員的共享。
function Animal() {
}
Animal.prototype.name="animal";function Person() {
}//修改Person的原型對(duì)象
Person.prototype= Animal.prototype;
Person.prototype.useTool = function () {
console.log("use fire");
}var p = new Person();console.log(p);var ani = new Animal();console.log(ani);
畫圖分析:
使用原型鏈繼承方式能夠繼承到更多的成員。但是依然存在問題:
null
創(chuàng)建一個(gè)空對(duì)象,這個(gè)空對(duì)象中連最基本的原型對(duì)象都沒有的
對(duì)象
創(chuàng)建傳遞進(jìn)來的對(duì)象,并設(shè)置該對(duì)象的原型對(duì)象為當(dāng)前的參數(shù)
該方法的使用率比較低,要求大家知道存在這樣的一種創(chuàng)建對(duì)象的方式即可。
call方法和apply方法的基本使用
call和apply方法作用:
SubClass.prototype = new SuperClass();//繼承原型鏈上的成員
總結(jié): ECMAScript 實(shí)現(xiàn)繼承的方式不止一種。這是因?yàn)?JavaScript 中的繼承機(jī)制并不是明確規(guī)定的,而是通過模仿實(shí)現(xiàn)的。這意味著所有的繼承細(xì)節(jié)并非完全由解釋程序處理。作為開發(fā)者,你有權(quán)決定最適用的繼承方式。
繪制完整的原型鏈結(jié)構(gòu)圖
這一節(jié)重點(diǎn)探討函數(shù)對(duì)象的原型鏈結(jié)構(gòu)。完整的結(jié)構(gòu)圖如下:
說了這么多,其實(shí)核心只有一個(gè):屬性共享和獨(dú)立的控制,當(dāng)你的對(duì)象實(shí)例需要獨(dú)立的屬性,所有做法的本質(zhì)都是在對(duì)象實(shí)例里面創(chuàng)建屬性。若不考慮太多,你大可以在Person里面直接定義你所需要獨(dú)立的屬性來覆蓋掉原型的屬性。總之,使用原型繼承的時(shí)候,要對(duì)于原型中的屬性要特別注意,因?yàn)樗麄兌际菭恳话l(fā)而動(dòng)全身的存在。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。