摘要:繼承繼承子類可以使用父類的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。類繼承父類父類添加共有方法子類繼承父類子類添加共有方法其中最核心的一句代碼是將原型指向了父類的原型對(duì)象。
繼承
繼承:子類可以使用父類的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。繼承的過程,就是從一般到特殊的過程。類繼承
// 父類 var supperClass = function() { var id = 1; this.name = ["js"]; this.superVal = function() { console.log("supreVal is true"); console.log(id); } } // 父類添加共有方法 supperClass.prototype.getSupperVal = function () { return this.superVal(); } // 子類 var subClass = function() { this.subVal = function() { console.log("this is subVal") } } // 繼承父類 subClass.prototype = new supperClass(); // 子類添加共有方法 subClass.prototype.getsubVal = function() { return this.subVal(); } var sub = new subClass(); sub.getSupperVal(); //superValue is true sub.getsubVal(); //this is subValue console.log(sub.name); sub.name.push("java"); //["javascript"] var sub2 = new subClass(); console.log(sub2.name); // ?["js", "java"]
其中最核心的一句代碼是SubClass.prototype = new SuperClass() ;
將原型__proto__ 指向了父類的原型對(duì)象。這樣子類就可以訪問父類的public 和protected 的屬性和方法,同時(shí),父類中的private 的屬性和方法不會(huì)被子類繼承。
缺點(diǎn)
敲黑板,如上述代碼的最后一段,使用類繼承的方法,如果父類的構(gòu)造函數(shù)中有【引用類型】,就會(huì)在子類中被所有實(shí)例共用,因此一個(gè)子類的實(shí)例如果更改了這個(gè)引用類型,就會(huì)影響到其他子類的實(shí)例。構(gòu)造函數(shù)繼承
正式因?yàn)橛辛松鲜龅娜秉c(diǎn),才有了構(gòu)造函數(shù)繼承,構(gòu)造函數(shù)繼承的核心思想就是SuperClass.call(this,id),直接改變this的指向,使通過this創(chuàng)建的屬性和方法在子類中復(fù)制一份,因?yàn)槭嵌鄮?fù)制的,所以各個(gè)實(shí)例化的子類互不影響。但是會(huì)造成內(nèi)存浪費(fèi)的問題
var parentClass = function(name, id) { this.name = name; this.id = id; this.getName = function(){ console.log(this.name) } } parentClass.prototype.show = function( ) { console.log(this.id) } var childClass = function(name, id) { parentClass.call(this, name, id); } var subClass = new childClass("zjj", 10);
我們先來總結(jié)一下類繼承和構(gòu)造函數(shù)繼承的優(yōu)缺點(diǎn)
= | 類繼承 | 構(gòu)造函數(shù)繼承 |
---|---|---|
核心思想 | 子類的原型是父類實(shí)例化的對(duì)象 | SuperClass.call(this,id) |
優(yōu)點(diǎn) | 子類實(shí)例化對(duì)象的屬性和方法都指向父類的原型 | 每個(gè)實(shí)例化的子類互不影響 |
缺點(diǎn) | 子類之間可能會(huì)互相影響 | 內(nèi)存浪費(fèi) |
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96827.html
摘要:前言本章我們要講解的是五大原則語言實(shí)現(xiàn)的第篇,里氏替換原則。因此,違反了里氏替換原則。與行為有關(guān),而不是繼承到現(xiàn)在,我們討論了和繼承上下文在內(nèi)的里氏替換原則,指示出的面向?qū)ο蟆? 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實(shí)現(xiàn)的第3篇,里氏替換原則LSP(The Liskov Substitution Principle )。英文原文:http://fre...
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對(duì)于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:原型鏈與繼承當(dāng)談到繼承時(shí),只有一種結(jié)構(gòu)對(duì)象。如果對(duì)該圖不怎么理解,不要著急,繼續(xù)往下看基于原型鏈的繼承對(duì)象是動(dòng)態(tài)的屬性包指其自己的屬性。當(dāng)使用操作符來作用這個(gè)函數(shù)時(shí),它就可以被稱為構(gòu)造方法構(gòu)造函數(shù)。 原型鏈與繼承 當(dāng)談到繼承時(shí),JavaScript 只有一種結(jié)構(gòu):對(duì)象。每個(gè)實(shí)例對(duì)象(object )都有一個(gè)私有屬性(稱之為proto)指向它的原型對(duì)象(prototype)。該原型對(duì)象也...
摘要:深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來看看這篇文章吧。讓我們用一張圖表示構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系在這張圖中我們用表示實(shí)例原型。 JavaScript深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來看看這篇文章吧。 構(gòu)造函數(shù)創(chuàng)建對(duì)象 我們先...
摘要:通常有這兩種繼承方式接口繼承和實(shí)現(xiàn)繼承。理解繼承的工作是通過調(diào)用函數(shù)實(shí)現(xiàn)的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強(qiáng)工作。適用基于某個(gè)對(duì)象或某些信息來創(chuàng)建對(duì)象,而不考慮自定義類型和構(gòu)造函數(shù)。 一、繼承的概念 繼承,是面向?qū)ο笳Z言的一個(gè)重要概念。通常有這兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。 《JS高程》里提到:由于函數(shù)沒有簽名,...
閱讀 1845·2021-11-23 09:51
閱讀 1303·2021-11-18 10:02
閱讀 974·2021-10-25 09:44
閱讀 2114·2019-08-26 18:36
閱讀 1634·2019-08-26 12:17
閱讀 1158·2019-08-26 11:59
閱讀 2755·2019-08-23 15:56
閱讀 3367·2019-08-23 15:05