摘要:實現(xiàn)思路使用原型鏈實現(xiàn)對原型方法和方法的繼承,而通過借用構(gòu)造函數(shù)來實現(xiàn)對實例屬性的繼承。繼承屬性繼承方法以上代碼,構(gòu)造函數(shù)定義了兩個屬性和。
JS面向?qū)ο蟮某绦蛟O(shè)計之繼承的實現(xiàn)-組合繼承
前言:最近在細讀Javascript高級程序設(shè)計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaScript高級程序設(shè)計第三版》。
組合繼承(Combination Inheritance)組合繼承(Combination Inheritance), 有時候也叫做偽經(jīng)典繼承,指的是:將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮兩者之長的一種繼承模式。
實現(xiàn)思路: 使用原型鏈實現(xiàn)對原型方法和方法的繼承,而通過借用構(gòu)造函數(shù)來實現(xiàn)對實例屬性的繼承。
這樣,既通過在原型上定義方法實現(xiàn)了函數(shù)復(fù)用,又能夠保證每個實例對象都有它自己的屬性。
function SuperType(name){ this.name = name; this.colors = ["red","green","blue"]; } SuperType.prototype.sayName = function(){ console.log(this.name); } function SubType(name, age) { //繼承屬性 SuperType.call(this, name); this.age = age; } //繼承方法 SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType(); SubType.prototype.sayAge = function(){ console.log(this.age); } var instance1 = new SubType("Shaw", 18); instance1.colors.push("black"); console.log(instance1.colors); //["red","green","blue","black"] instance1.sayName(); // "Shaw" instance1.sayAge(); // 18 var instance2 = new SubType("Roc", 19); console.log(instance2.colors); // ["red", "green", "blue"] instance2.sayName(); // "Roc" instance2.sayAge(); // 19
以上代碼,SuperType構(gòu)造函數(shù)定義了兩個屬性:name和colors。
在SuperType的原型上定義了一個sayName()方法。
SubType構(gòu)造函數(shù)在調(diào)用SuperType構(gòu)造函數(shù)時傳入了name參數(shù),緊接著又定義了它自己的屬性age。
然后,將SuperType的實例對象賦值給SubType的原型,然后又在該新原型上定義了sayAge()方法、
這樣一來,就可以讓兩個不同的SubType實例對象既分別擁有自己的屬性——包括colors屬性,又可以使用相同的方法了。
組合避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,融合了他們的優(yōu)點。成為JavaScript中最常用的繼承模式。而且, 操作符 instanceof 和 isPrototypeOf()方法也能夠用于識別基于組合繼承創(chuàng)建的對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98601.html
摘要:組合繼承最大的問題就是無論在什么情況下,都會調(diào)用兩次超類型構(gòu)造函數(shù)一次是在創(chuàng)建子類型原型的時候。好在,我們已經(jīng)找到了解決這個問題方法寄生組合式繼承所謂寄生組合式繼承,即通過借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混成形式來繼承方法。 寄生組合式繼承 組合繼承是JavaScript最常用的繼承模式。 不過,它也有自己的不足。 組合繼承最大的問題就是無論在什么情況下,都會調(diào)用兩次超類型構(gòu)造函數(shù)...
摘要:以下是幾種中實現(xiàn)繼承的方式方法它們也是各自有各自的優(yōu)缺點選擇哪一種根據(jù)自己的應(yīng)用而定最適合自己的才是最好的通過原型鏈繼承通過原型對象繼承缺點引用類型的值在原型中會被所有實例共享不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)借用構(gòu)造函數(shù)繼承借用構(gòu)造函數(shù)繼承是 以下是幾種js中實現(xiàn)繼承的方式方法,它們也是各自有各自的優(yōu)缺點,選擇哪一種根據(jù)自己的應(yīng)用而定,最適合自己的才是最好的. 通過原型鏈繼承 funct...
摘要:使用原型鏈實現(xiàn)對原型屬性和方法的繼承,用借用構(gòu)造函數(shù)模式實現(xiàn)對實例屬性的繼承。 我們之前介紹了javascript面向?qū)ο蟮姆庋b的相關(guān)內(nèi)容,還介紹了js的call方法,今天開始討論js的繼承這篇文章參考了《javascript高級程序設(shè)計》(第三版),但內(nèi)容不局限于,網(wǎng)上很多關(guān)于js繼承的相關(guān)內(nèi)容都是來自于這本書,有興趣的同學(xué)可以翻閱查看 原型鏈繼承 我們先通過一個栗子,了解一下原型鏈...
摘要:除此之外,在超類型的原型中定義的方法,對子類型而言也是不可兼得,結(jié)果所有類型都只能用構(gòu)造函數(shù)模式。創(chuàng)建對象增強對象指定對象繼承屬性這個例子的高效率體現(xiàn)在它只調(diào)用了一次構(gòu)造函數(shù)。 1、原型鏈 原型鏈的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。構(gòu)造函數(shù)、原型和實例的關(guān)系:每個構(gòu)造函數(shù)都有一個原型對象;原型對象都包含著一個指向構(gòu)造函數(shù)的指針;實例都包含一個指向原型對象的...
摘要:之面向?qū)ο髮ο箢愋蛿?shù)據(jù)類型分六類簡單類型五種復(fù)雜類型其中也屬于基本類型。 js之面向?qū)ο?OOP) js對象類型(Object) js數(shù)據(jù)類型分六類,簡單類型:Undefined,Null,Bollean,Number,String五種,復(fù)雜類型:Object.其中Undefined、Null、Boolean、Number也屬于基本類型。Object、Array和Function則屬...
閱讀 2473·2021-11-24 09:39
閱讀 3406·2021-11-15 11:37
閱讀 2251·2021-10-08 10:04
閱讀 3965·2021-09-09 11:54
閱讀 1883·2021-08-18 10:24
閱讀 1034·2019-08-30 11:02
閱讀 1793·2019-08-29 18:45
閱讀 1651·2019-08-29 16:33