亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript常見繼承模式實例小結

2024-05-06 16:47:43
字體:
來源:轉載
供稿:網友

本文實例總結了JavaScript常見繼承模式。分享給大家供大家參考,具體如下:

JavaScript中并沒有傳統的面向對象語言中的類的概念,但是卻實現了特殊的繼承機制。

(閱讀此文您首先需要知道原型的知識)

先來說說第一種繼承方式,原型鏈繼承。

一. 原型鏈繼承

所謂原型鏈繼承,就是讓父類的一個實例作為子類的原型。

即 :

parentInstance = new Parent();child.prototype = parentInstance;

這樣,在創建子類的實例時,子類實例的__proto__指向父類的實例(即此時子類構造函數的prototype屬性),而父類實例的__proto__又指向父類構造函數的prototype屬性。借用這種方式形成了一條原型鏈。

由于JavaScript中搜索實例中調用的變量有如下方式:

  1. 在當前實例中尋找變量名
  2. 在當前實例所指向的原型中尋找

假設原型鏈中有如下繼承關系:

grandparent(有方法 grandparent.prototype.sayHello) -> parent -> child

當在child的實例child_ming調用方法 sayHello 時,首先在child_ming中(即只定義在child_ming這一個實例中,而非所有實例中)搜索sayHello,并未找到,然后開始搜索它所指向的原型,即parent的實例。在parent的實例中也沒有此方法,開始搜索parent的原型,即grandparent的實例。在grandparent的實例中依然沒有找到,又搜索grandparent的原型并找到該方法。

可以看出,這樣便實現了繼承。

如同在使用prototype創建對象時遇到的問題,倘若完全使用原型鏈進行繼承,會使得一些需要繼承但不需要在不同實例間進行共享的屬性變得不方便實現。

下面就要說一說借用構造函數實現的繼承。

二. 借用構造函數實現繼承

所謂借用構造函數實現繼承,即在子類的構造函數中把父類的構造函數借來使用,以求在子類中生成父類的屬性。

看如下代碼:

function Parent(color){  this.color = color;  this.getColor = function(){ alert(this.color); };}function Child(color,size){  Parent.call(this,color);  this.size = size;}

這就是一個簡單的借用構造函數的繼承。

通過使用父類的構造函數,可以使得同一構造函數的不同的實例的同一屬性擁有不同的值。解決了原型鏈繼承中的屬性共享的弊端。

然而,如同使用構造函數創建對象時遇到的問題,通過構造函數生成的方法面臨著重復定義的問題,同一類下的不同實例擁有各自的方法,而一般來講方法是需要實現復用的,沒有必要讓它們擁有各自的方法。

使用組合繼承可以解決這個問題。

三. 組合繼承(原型鏈與借用構造函數)

既然原型鏈可以實現屬性共享,借用構造函數可以實現屬性值的私有,不妨將它們結合起來,這就形成了組合繼承。

所謂組合繼承,實際上就是用一次原型鏈繼承,用一次借用構造函數繼承。

看如下代碼:

function Parent(color){  this.color = color;}Parent.prototype.getColor = function(){ alert(this.color); };function Child(color,size){  Parent.call(this,color); //借用構造函數繼承屬性  this.size = size;}//下面的屬性'green'并沒有影響,這里要使用原型繼承方法Child.prototype = new Parent('green');var child_demo = new Child('red',200);

首先思考這樣兩個問題,創建一個child 實例到底生成了幾份color 屬性?在代碼中既定義了'red' 又定義了 ‘green',當調用 child_demo.getColor() 時,到底會alert 哪一個?

首先來看第一個問題。由于子類構造函數中借用了父類的構造函數,在創建子類實例時必然會生成一次color 屬性。但是不要忘記,我們在繼承方法時是讓子類構造函數的原型指向一個父類的實例,在創建這個父類實例時還要生成一次color 屬性(即上面'green'處),而這個屬性是完全沒有必要存在的。所以一共生成了兩份color 屬性,一個有用一個沒用。

再來看第二個問題。只要能理解this 的含義就可以知道:

child_demo.getColor() // 'red'Child.prototype.getColor() //'green'

組合繼承結合了前兩種繼承方式的優點,但它也有自己的缺點。從生成兩份color 屬性可以知道在繼承過程中調用了兩次Parent 的構造函數,這會造成執行完成速度的問題,影響了效率。但是瑕不掩瑜,這種繼承方式還是成為了JavaScript中最常用的繼承模式。

四. 原型式繼承

原型式繼承是從已有對象的基礎上繼承,基于已有對象創建新的對象。

看如下代碼:

var obj = {  color: 'red',  getColor: function(){ alert(this.color); },};//getChild(obj)返回的是一個__proto__指向obj的實例function getChild(obj){  function func(){}  func.prototype = obj;  return new func();}var child_demo = getChild(obj);

這種繼承方式與原型鏈式的繼承方式有相同點和不同點。

相同點:它們都是通過改變子類構造函數的原型屬性來實現繼承,所繼承的屬性都具有不同實例共享的特點。

不同點:原型鏈繼承中子類構造函數的原型(prototype)是父類的一個實例(我們真正需要繼承的東西可能存在于父類構造函數的原型中,也可能存在于直接指向的父類實例中),而原型式繼承中子類構造函數的原型是一個已有的對象,可以說直接就是父類。

五. 寄生式繼承

寄生式繼承可以說是原型式繼承的變體,它對原型式繼承進行了封裝,使得創建子類實例只依賴于一個函數。

看如下代碼:

var obj = {  color: 'red',  getColor: function(){ alert(this.color); },};function getChild(obj){  function func(){}  func.prototype = obj;  return new func();}/*-------以上是原型式繼承的代碼----------*/function betterGetChild(obj,size){  var temp_obj = getChild(obj);  temp_obj.size = size;  temp_obj.getSize = function(){ return this.size; };  return temp_obj;}var demo = betterGetChild(obj,200);

六. 寄生組合式繼承

寄生組合式是組合繼承加上原型式繼承的應用。由于組合式繼承中子類構造函數的原型指向父類的一個實例而非父類構造函數的原型,會導致設置子類構造函數的原型時對父類的構造函數進行一次額外的調用。所以在寄生式組合繼承中,借用原型式繼承的思想,將父類構造函數的原型當作一個已有對象,讓子類構造函數的原型直接指向它。

看如下代碼:

function getChild(obj){  function func(){}  func.prototype = obj;  return new func();  //調用構造函數}/*-------以上是原型式繼承的代碼----------*/function Parent(color){  this.color = color;}Parent.prototype.getColor = function(){  alert(this.color);};function Child(color,size){  Parent.call(this,color); //調用構造函數  this.size = size;}//Child.prototype直接指向一個__proto__指向Parent.prototype的實例Child.prototype = getChild(Parent.prototype);Child.prototype.getSize = function(){ alert(this.size); };

其實嚴格來說,這種方式也調用了兩次構造函數,但是其中一次構造函數的調用是對一個空函數的調用,而不是兩次都調用父類的構造函數。

在組合繼承中,在子類的原型中其實還保存有父類的沒有定義在原型中的屬性(由于子類構造函數的原型是父類的一個實例),只不過是子類構造函數在借用父類構造函數在當前實例中生成了覆蓋原型中那些屬性的屬性。而寄生式組合繼承中,根本不會產生那些冗余數據。

人們普遍認為寄生時組合繼承是最理想的繼承方式。

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性xxxx极品高清hd直播| 国产精品视频免费观看www| 97国产成人精品视频| 久久久久久久久爱| 国产精品专区第二| 九九九热精品免费视频观看网站| 麻豆成人在线看| 久久久久一本一区二区青青蜜月| 日韩在线视频播放| 91精品国产成人www| 亚洲欧洲日韩国产| 日韩中文字幕视频| 亚洲成人在线视频播放| 亚洲美女av在线播放| 人人爽久久涩噜噜噜网站| 亚洲欧洲在线视频| 亚洲欧美另类在线观看| 国产精品自在线| 国产精品美女av| 欧美限制级电影在线观看| 久久综合五月天| 久久久噜噜噜久噜久久| 久久久久免费视频| 国产精品久久久久久五月尺| 精品露脸国产偷人在视频| 国内精品国产三级国产在线专| 国产精品91在线| 欧美老少配视频| 日本韩国欧美精品大片卡二| 91精品久久久久久久久久| 91sao在线观看国产| 欧美另类交人妖| 另类色图亚洲色图| 91亚洲精品在线| 日韩精品久久久久久福利| 成人免费网站在线观看| 欧美尺度大的性做爰视频| 欧美寡妇偷汉性猛交| 91在线精品视频| 欧美日韩中文在线观看| 国产精品久久久久久久久免费看| 国产成人精品视频在线观看| 91沈先生作品| 亚洲成av人片在线观看香蕉| 热99精品只有里视频精品| 成人精品aaaa网站| 国产日韩精品一区二区| 欧美www在线| 欧美精品一区二区三区国产精品| 日韩男女性生活视频| 午夜精品一区二区三区视频免费看| 在线观看国产成人av片| 亚洲在线免费观看| 日韩在线观看免费高清完整版| 国产精品自产拍在线观看| 国产精品吊钟奶在线| 亚洲精品美女在线观看播放| 亚洲欧洲日产国产网站| 成人国产精品一区二区| 日韩一区二区av| 中文在线不卡视频| 欧美日韩在线视频观看| 国产精品日日摸夜夜添夜夜av| 欧美性受xxx| 美女福利视频一区| 欧美黑人极品猛少妇色xxxxx| 中文字幕av一区二区| 91av在线视频观看| 欧美性视频网站| 97国产在线视频| 久久精品国产精品亚洲| 午夜免费久久久久| 欧美激情亚洲精品| 精品久久久免费| 日韩中文字幕第一页| 国产日韩在线视频| 亚洲影院高清在线| 成人激情在线播放| 亚洲新声在线观看| 日韩美女在线观看一区| 一区二区三区高清国产| 亚洲无亚洲人成网站77777| 伊人青青综合网站| 最近2019年中文视频免费在线观看| 欧美日韩免费区域视频在线观看| 超碰日本道色综合久久综合| 亚洲第一免费网站| 日韩欧美亚洲国产一区| 夜夜狂射影院欧美极品| 国产亚洲成av人片在线观看桃| 91精品国产91久久久| 26uuu久久噜噜噜噜| 91精品免费视频| 亚洲精品成人久久电影| 在线视频日本亚洲性| 精品福利樱桃av导航| 日韩在线观看精品| 欧美成人免费视频| 国产xxx69麻豆国语对白| 精品成人av一区| 日韩激情av在线免费观看| 亚洲国产成人久久| 中文字幕欧美亚洲| 夜色77av精品影院| 日韩久久午夜影院| 欧美在线观看www| 久热爱精品视频线路一| 91在线观看免费网站| 亚洲欧美日韩第一区| 欧美午夜精品久久久久久久| 亚洲精品www久久久| 欧美黄色三级网站| 色播久久人人爽人人爽人人片视av| 国产精品黄页免费高清在线观看| 国产欧美日韩丝袜精品一区| 国产精品人成电影在线观看| 久久久久久久一区二区三区| 国产视频精品一区二区三区| 国产精品入口日韩视频大尺度| 91九色国产在线| 九色91av视频| 日韩精品免费在线| 亚洲老司机av| 国产精品天天狠天天看| 国产日韩欧美自拍| 中文字幕欧美专区| 亚洲综合中文字幕在线| 国产精品7m视频| 精品国产依人香蕉在线精品| 欧美中文字幕在线播放| 欧美丰满少妇xxxx| 日韩亚洲成人av在线| 自拍偷拍亚洲精品| 综合激情国产一区| 青青久久aⅴ北条麻妃| 美女啪啪无遮挡免费久久网站| 自拍偷拍亚洲区| 色哟哟入口国产精品| 欧美激情xxxx| 日韩av免费看网站| 欧美在线观看网站| 精品国内产的精品视频在线观看| 成人黄色免费在线观看| 色在人av网站天堂精品| 日韩欧美中文字幕在线播放| 97视频在线观看亚洲| 亚洲跨种族黑人xxx| 亚洲成人黄色网| 欧美做受高潮1| 色小说视频一区| 日韩欧美中文在线| 91日本在线观看| 欧美激情videos| 亚洲人成在线一二| 色悠悠久久久久| 国产成人精品亚洲精品| 在线播放日韩av| 国产色综合天天综合网| 国产精品久久91| 亚洲美女又黄又爽在线观看| 伊人激情综合网| 国产亚洲美女精品久久久| 久久成人在线视频| 亚洲黄页网在线观看|