摘要:還有一個(gè)問題,就是不能在創(chuàng)建子類性時(shí),像父類型的構(gòu)造函數(shù)傳遞參數(shù)。組合繼承將原型鏈和借用構(gòu)造函數(shù)組合到一起,發(fā)揮兩者之長(zhǎng)的一張繼承模式,下面來(lái)看個(gè)例子。組合繼承最大的問題是無(wú)論在什么情況下,都會(huì)調(diào)用兩次父類型構(gòu)造函數(shù)。
繼承
繼承是面向?qū)ο笳Z(yǔ)言中特別重要的概念,js的繼承主要是靠原型鏈實(shí)現(xiàn)的。
原型鏈!!!看到我給標(biāo)題打了三個(gè)嘆號(hào)嗎,這里真的很重要!這里真的很重要!這里真的很重要!js描述了原型鏈的概念,并將原型鏈做為實(shí)現(xiàn)繼承的主要方法,其基本思想是讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。看代碼
function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = function () { return this.property; } function SubType () { this.Subproperty = false; } SubType.prototype = new SuperType(); SuperType.prototype.getSubValue = function () { return this.subproperty; } var instance = new SubType(); console.log(instance.getSuperValue())
下面繼續(xù)上我的靈魂畫作:
話不多說,原理都在圖里,相信聰明的你們?cè)缇投恕T谏厦娴拇a中,我們沒有使用SubType默認(rèn)提供的原型,而是給它換了一個(gè)新原型。這個(gè)原型是父類的實(shí)例,新原型具有全部屬性和方法,現(xiàn)在也存在于子類的原型中了。
通過原型鏈,本質(zhì)上擴(kuò)展了原型搜索機(jī)制。在instance.getSuperValue()調(diào)用會(huì)經(jīng)歷三個(gè)搜索步驟
搜索實(shí)例
搜索原型對(duì)象
搜索父類原型對(duì)象
一環(huán)一環(huán)向上搜索直到原型鏈末端才會(huì)停下來(lái)。但是我們子類上的valueOf這些方法是哪里來(lái)的呢?父類并沒有顯示聲明這些方法啊下面繼續(xù)上圖。
SubType繼承了SuperType,SuperType繼承了Object,當(dāng)調(diào)用instance.valueOf()方法時(shí),實(shí)際上調(diào)用的是保存在Object.prototype中的方法。
原型鏈的問題原型鏈這么強(qiáng)大,同樣也會(huì)造成問題。最主要的問題來(lái)自于包含引用類型的原型。引用類型的原型屬性會(huì)被雖有實(shí)例共享,在通過原型來(lái)實(shí)現(xiàn)繼承時(shí),原型會(huì)變成另一個(gè)類型的實(shí)例,原先的實(shí)例屬性也就順理成章變成來(lái)現(xiàn)在的原型屬性。
function SuperType () { this.colors = ["red", "blue", "green"]; } function SubType () { } SubType.prototype = new SuperType(); var instance1 = new SubType(); instance1.colors.push("black"); console.log(instance1.colors) var instance2 = new SubType(); console.log(instance2.colors)
還有一個(gè)問題,就是不能在創(chuàng)建子類性時(shí),像父類型的構(gòu)造函數(shù)傳遞參數(shù)。所以我們一般很少多帶帶使用原型鏈。
借用構(gòu)造函數(shù)function SuperType () { this.colors = ["red", "blue", "green"]; } function SubType () { // 繼承了 SuperType SuperType.call(this); } var instance1 = new SubType(); instance1.colors.push("black"); console.log(instance1.colors); var instance2 = new SubType(); console.log(instance2.colors);
也可以傳遞參數(shù)
function SuperType (name) { this.name = name; } function SubType () { // 繼承了 SuperType SuperType.call(this, "李小花"); } var instance1 = new SubType(); console.log(instance1.name) 但是這樣問題也很明顯,方法只能定義在構(gòu)造函數(shù)中定義,定義在原型上的方法無(wú)法繼承。借用構(gòu)造函數(shù)的技術(shù)也很少使用。組合繼承
將原型鏈和借用構(gòu)造函數(shù)組合到一起,發(fā)揮兩者之長(zhǎng)的一張繼承模式,下面來(lái)看個(gè)例子。
function SuperType (name) { this.name = name; } SuperType.prototype.sayName = function() { console.log(this.name) }; function SubType (name, age) { // 繼承了 SuperType SuperType.call(this, name); this.age = age; } SubType.prototype = new SuperType(); var instance1 = new SubType(); console.log(instance1.name)
寄生組合式繼承組合繼承是 js最常用的繼承模式。
組合繼承是最常用的繼承模式,但也不是沒有缺點(diǎn)。組合繼承最大的問題是無(wú)論在什么情況下,都會(huì)調(diào)用兩次父類型構(gòu)造函數(shù)。
function SuperType (name) { this.name = name; } SuperType.prototype.sayName = function() { console.log(this.name) }; function SubType (name, age) { // 繼承了 SuperType SuperType.call(this, name); //第二次調(diào)用 this.age = age; } SubType.prototype = new SuperType(); // 第一次調(diào)用 var instance1 = new SubType(); console.log(instance1.name)
我們不必為了指定子類型的原型調(diào)用超類型的構(gòu)造函數(shù),我們所需要的不過是超類型原型的一個(gè)副本而已。
function SuperType (name) { this.name = name; this.color = ["red", "blue", "green"]; } SuperType.prototype.sayName = function() { console.log(this.name); }; function SubType (name, age) { SuperType.call(this, name); this.age = age; } SubType.prototype = Object.create(SuperType.prototype); SubType.prototype.constructor = SubType
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/83499.html
摘要:一面向?qū)ο缶幊袒A(chǔ)實(shí)踐通過對(duì)象的編程方式,可將實(shí)現(xiàn)生活中的一切事物以對(duì)象的形式表現(xiàn)出來(lái)。此時(shí)程序也將會(huì)報(bào)致命錯(cuò)誤。屬性不可訪問或未定義,值判斷對(duì)象中的屬性不存在時(shí),自動(dòng)執(zhí)行該函數(shù)。屬性值未定義釋放對(duì)象中的不存在的屬性值時(shí),自動(dòng)執(zhí)行該函數(shù)。 一、PHP面向?qū)ο缶幊袒A(chǔ)實(shí)踐 二、PHP面向?qū)ο蟾呒?jí)編程實(shí)踐 知識(shí)點(diǎn):類的繼承、方法重寫、訪問控制、static關(guān)鍵字、final關(guān)鍵字、數(shù)據(jù)訪...
摘要:引言對(duì)于面向?qū)ο螅嘈糯蠹乙欢ú荒吧?chuàng)建對(duì)象面向?qū)ο蟮谝徊绞鞘裁创饎?chuàng)建對(duì)象。構(gòu)造函數(shù)優(yōu)于工廠模式也是在于它可以通過辨識(shí)出一類的對(duì)象。 引言 對(duì)于面向?qū)ο螅嘈糯蠹乙欢ú荒吧W罱戳艘恍╆P(guān)于es6面向?qū)ο蟮闹R(shí),正好通過這篇文章把關(guān)于面向?qū)ο蟮臇|西給串起來(lái)分享給大家。 什么是對(duì)象 很多人會(huì)鄙視我,說你這篇文章是騙騙剛?cè)胄械男∨笥训陌桑裁词菍?duì)象我還能不知道?罵我的吃瓜群眾先冷靜一下,...
摘要:中的和是一門很靈活的語(yǔ)言,尤其是。即然是面向?qū)ο蟮木幊陶Z(yǔ)言,那也是不可或缺的。在中,永遠(yuǎn)指向的是他的調(diào)用者。定義是存在于實(shí)例化后對(duì)象的一個(gè)屬性,并且指向原對(duì)象的屬性。我們?cè)跀U(kuò)展的時(shí)候,同時(shí)父類也會(huì)有對(duì)應(yīng)的方法,這很顯然是一個(gè)很嚴(yán)重的問題。 javascript中的this和new javascript是一門很靈活的語(yǔ)言,尤其是function。他即可以以面向過程的方式來(lái)用,比如: f...
摘要:我們通過這個(gè)構(gòu)造函數(shù)為原型對(duì)象添加其他方法和屬性。這個(gè)屬性存在與實(shí)例與構(gòu)造函數(shù)的原型對(duì)象上直接,而不存在于實(shí)例與構(gòu)造函數(shù)之間。李小花班花張全蛋張全蛋李小花李小花我們?cè)诒闅v對(duì)象的的屬性的時(shí)候,經(jīng)常需要判斷屬性是否來(lái)自于對(duì)象的原型還是屬性。 引言 上面說了創(chuàng)建對(duì)象有字面量方式和工廠模式還有構(gòu)造函數(shù)模式,結(jié)果發(fā)現(xiàn)他們都各自有缺點(diǎn),所以下面再給大家介紹幾種創(chuàng)建對(duì)象的方式,爭(zhēng)取能找到一種無(wú)痛的模...
閱讀 2822·2023-04-26 02:00
閱讀 2780·2019-08-30 15:54
閱讀 871·2019-08-30 11:15
閱讀 1511·2019-08-29 15:31
閱讀 925·2019-08-29 14:12
閱讀 495·2019-08-29 13:08
閱讀 847·2019-08-27 10:51
閱讀 2715·2019-08-26 12:17