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