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

首頁 > 語言 > JavaScript > 正文

學習JavaScript設計模式(繼承)

2024-05-06 16:25:20
字體:
來源:轉載
供稿:網友
這篇文章主要帶領大家學習JavaScript設計模式,其中重點介紹繼承,舉例說明為什么需要繼承,對繼承進行詳細剖析,感興趣的小伙伴們可以參考一下
 

1、繼承

在javascript中繼承是一個非常復雜的話題,比其他任何面向對象語言的中的繼承都復雜得多。在大多數其他面向對象語言中,繼承一個類只需要使用一個關鍵字即可。與它們不同,在javascript中要想達到傳承公用成員的目的,需要采取一系列措施。更有甚者,javascript屬于使用原型式繼承的少數語言之一。利益于這種語言的靈活性,你既可使用標準的基于類的繼承,也可使用更微妙一些的原型式繼承。

2、為什么需要繼承?

一般來說,在設計類的時候,我們希望能減少重復性的代碼,并且盡量弱化對象間的耦合。使用繼承符合前一個設計原則的需要。借助這種機制,你可以在現有類的基礎上進行設計并充分利用它們已經具備的各種方法,而對設計進行修改也更為輕松。假設你需要讓幾個類都擁有一個按特定方式輸出類結構的toString()方法,當然可以用復制加粘貼的辦法把定義toString()方法的代碼添加到每一個類中,但這樣做的話,每當需要改變這個方法的工作方式時,你將不得不在每一個類中重復同樣的修改。反之,如果你提供了一個ToStringProvider類,然后讓那些類繼承這個類,那么toString這個方法只需在一個地方聲明即可。

讓一個類繼承另一個類可能會導致二者產生強耦合,也即一個類的依賴于另一個類的內部實現。我們將討論一些有助于避免這種問題的技術,其中包括用摻元類為其他類提供方法這種技術。

3、基于類的繼承

下面看下面的代碼:

<script type="text/javascript">   function Person(name, age)   {    this.name = name;    this.age = age;   }   Person.prototype.say = function ()   {    console.log(this.name + " , " + this.age);   }   function Student(no)   {    this.no = no;   }   /**    * Student的prototype指向Person的對象    */</span>   Student.prototype = new Person();   var stu1 = new Student("0001");   stu1.name = '張三';   stu1.age = '11';   console.log(stu1.no);   stu1.say();  </script> 

輸出結果:   
張三 , 11   
可以看到Student成功集成了Person,并且擁有了Person的say方法,核心代碼其實就是一句 Student.prototype = new Person();,下面通過圖解來說明原理:

學習JavaScript設計模式(繼承)

將Student.prototype指向new Person() , new Person的_proto_又指向Person Prototype;這樣完成了整個繼承。

但是這種方式存在問題:

問題1:當父類存在引用類型變量時,造成數據不一致,下面我們給Person添加一個hobbies屬性,類型為數組。

<script type="text/javascript">   /**   * 存在問題   * 1、無法在Student的構造方法中傳遞參數用于父類的構造方法   * 2、對于引用類型變量,造成數據不一致   */   function Person(name, age)   {    this.name = name;    this.age = age;    this.hobbies = [] ;   }   Person.prototype.say = function ()   {    console.log(this.name + " , " + this.age +" , " +this.hobbies);   }   function Student(no)   {    this.no = no;   }   Student.prototype = new Person();   var stu1 = new Student("0001");   stu1.name = '張三';   stu1.age = '11';   stu1.hobbies.push("soccer");   stu1.say();   var stu2 = new Student("0002");   stu2.name = '李四';   stu2.age = '12';   stu2.hobbies.push("girl");   stu2.say();  </script> 

輸出結果:
張三 , 11 , soccer   
李四 , 12 , soccer,girl   

可以看出,李四的hobbies應該只有girl,但是上面的代碼讓所有對象共享了hobbies屬性。 
上述的繼承方式還存在一個問題:

問題2:在Student的構造方法中,無法使用new Student(“00001” , “張三” , 12) ;創建對象,并初始化name和age屬性,必須stu.name, stu.age進行賦值

為了解決上述問題,對上述代碼進行修改:

<script type="text/javascript">   function Person(name, age)   {    this.name = name;    this.age = age;    this.hobbies = [];   }   Person.prototype.say = function ()   {    console.log(this.name + " , " + this.age +" , " + this.hobbies);   }   function Student(name, age, no)   {    /**    * 使用call方法,第一個參數為上下文;    * 有點類似Java中的super(name,age)的感覺    */    Person.call(this, name, age);    this.no = no;   }   Student.prototype = new Person();   var stu1 = new Student("0001","張三",11);   stu1.hobbies.push("soccer");   stu1.say();   var stu2 = new Student("0002","李四",12);   stu2.hobbies.push("cangjin");   stu2.hobbies.push("basketball");   stu2.say();  </script> 

輸出:
0001 , 張三 , soccer   
0002 , 李四 , cangjin,basketball   

在Student的構造方法中使用了Person.call(this,name,age)感覺就像super(name,age)【call的第一個參數為上下文】;并且成功解決了對引用屬性的共享問題,完美解決。

4、基于原型鏈的繼承

<script type="text/javascript">  /**   * 基于原型鏈的集成中都是對象   * 存在問題:   * 1、對于引用類型變量,造成數據不一致   */  var Person = {     name: "人",     age: 0,     hobbies: [],     say: function ()     {      console.log(this.name + " , " + this.age + " , " + this.hobbies);     }    }    ;  var Student = clone(Person);  Student.no ="";  Student.sayHello = function()  {   console.log(this.name +"hello ") ;  }  var stu1 = clone(Student);  stu1.name = "zhangsan";  stu1.age = 12;  stu1.hobbies.push("Java");  stu1.say();  var stu2 = clone(Student);  stu2.name = "lisi";  stu2.age = 13;  stu2.hobbies.push("Javascript");  stu2.say();  /**   * 返回一個prototype執行obj的一個對象   * @param obj   * @returns {F}   */  function clone(obj)  {   var F = function ()   {   };   F.prototype = obj;   return new F();  } </script> 

輸出:
zhangsan , 12 , Java   
lisi , 13 , Java,Javascript   

可以看出同樣存在引用屬性不一致的問題,并且整個操作全部基于對象,給人的感覺不是很好,下面通過圖解解釋下原理:

學習JavaScript設計模式(繼承)

對象間通過一個clone函數,不斷的返回一個新的對象,且prototype執行傳入的對象,整個繼承過程其實就是_proto_不斷的指向,形成一個鏈,所以叫做原型鏈。

好了,已經介紹完了,js的兩種集成的方式,最好使用的還是通過類的繼承,比較穩定。

以上就是關于繼承知識點的相關內容介紹,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频观看| 91九色视频导航| 国产一区二区三区欧美| 日韩中文字幕在线观看| 日本高清不卡在线| 国产亚洲精品综合一区91| 91在线免费网站| 国产日韩欧美夫妻视频在线观看| 日韩免费在线免费观看| 精品国产91久久久| 亚洲一区二区三区视频| 亚洲美女在线视频| 亚洲精品91美女久久久久久久| 亚洲男人天堂视频| 3344国产精品免费看| 亚洲第一网站男人都懂| 国产精品视频一区二区三区四| 91精品91久久久久久| 国产欧美一区二区| 精品调教chinesegay| 91久久国产精品91久久性色| 亚洲缚视频在线观看| 久久韩剧网电视剧| 久久在精品线影院精品国产| 亚洲成人1234| 中文字幕亚洲欧美日韩在线不卡| 黄色91在线观看| 色樱桃影院亚洲精品影院| 欧美亚洲成人精品| 92国产精品久久久久首页| 色99之美女主播在线视频| 亚洲天堂男人天堂女人天堂| 在线播放国产一区中文字幕剧情欧美| 欧美裸体xxxx极品少妇| 日韩欧美精品中文字幕| 91av在线网站| 成人国产精品日本在线| 国产精品久久中文| 亚洲国产中文字幕久久网| 丝袜美腿亚洲一区二区| 欧美精品精品精品精品免费| 91精品国产成人www| 成人观看高清在线观看免费| 成人国产精品久久久| 国产精品日韩在线观看| 亚洲最新在线视频| 久久人人爽亚洲精品天堂| 亚洲色图色老头| 成人xxxxx| 精品日本高清在线播放| 18性欧美xxxⅹ性满足| 欧美国产日韩二区| 亚洲欧美国产制服动漫| 国产亚洲在线播放| 岛国av一区二区| 动漫精品一区二区| 精品中文字幕久久久久久| 日韩麻豆第一页| 国产在线拍偷自揄拍精品| 国产精品视频xxxx| 久久久久久久久久久成人| 色偷偷偷亚洲综合网另类| 欧美疯狂性受xxxxx另类| 97精品在线观看| 亚洲国产成人爱av在线播放| 色综合色综合久久综合频道88| 欧美精品成人在线| 一区二区三区高清国产| 欧美午夜激情视频| 国内精品久久久久影院优| 成人福利免费观看| 中文字幕少妇一区二区三区| 亚洲精品中文字幕女同| 91精品国产高清久久久久久久久| 91精品国产成人| 日韩在线欧美在线| www.欧美视频| 欧美成人黑人xx视频免费观看| 国产精品美女久久久免费| 91精品国产高清自在线看超| 国产精品欧美久久久| 久久精品国产久精国产思思| 日韩大陆毛片av| 欧美成人黑人xx视频免费观看| 麻豆一区二区在线观看| 欧美人在线观看| 日韩av电影免费观看高清| 国产97在线视频| 久久天天躁狠狠躁夜夜躁| 欧美在线一区二区三区四| 爱福利视频一区| 久久婷婷国产麻豆91天堂| 亚洲品质视频自拍网| 色99之美女主播在线视频| 亚洲天堂久久av| 最近日韩中文字幕中文| 欧美黄色成人网| 色偷偷偷综合中文字幕;dd| 岛国av一区二区| 精品香蕉一区二区三区| 日韩av一区在线| 伊人久久大香线蕉av一区二区| 久久综合免费视频影院| 久久精品青青大伊人av| 菠萝蜜影院一区二区免费| 超碰精品一区二区三区乱码| 色老头一区二区三区在线观看| 亚洲国产福利在线| 亚洲成人免费在线视频| 国产黑人绿帽在线第一区| 高清欧美性猛交| 亚洲精品欧美日韩专区| 亚洲国产精品大全| 久久久成人精品视频| 欧美激情第6页| 欧美又大粗又爽又黄大片视频| 国产一区欧美二区三区| 一区二区亚洲精品国产| 欧洲一区二区视频| 久久久伊人欧美| 欧美洲成人男女午夜视频| 中文字幕自拍vr一区二区三区| 亚洲欧洲视频在线| 亚洲人成电影网站| 色偷偷亚洲男人天堂| 日本成熟性欧美| 久久久久亚洲精品成人网小说| 日韩欧中文字幕| 色偷偷av亚洲男人的天堂| 91精品国产综合久久香蕉922| 久久资源免费视频| 精品色蜜蜜精品视频在线观看| 国产激情综合五月久久| 免费av一区二区| 亚洲人成毛片在线播放| 精品久久久久久久久久久久| 亚洲影院高清在线| 亚洲国产精品va在线| 一区国产精品视频| xxxxx成人.com| 精品久久久av| 亚洲成色999久久网站| 国产香蕉97碰碰久久人人| 浅井舞香一区二区| 国产精品久久久久久久av大片| 国产精品久久久久久搜索| 亚洲xxxxx电影| 亚洲国产精品小视频| 国内精品400部情侣激情| 国语自产精品视频在线看一大j8| 亚洲国产精品久久久久| 日本午夜精品理论片a级appf发布| 97国产suv精品一区二区62| 国产精品永久免费观看| 欧美视频13p| 欧美成人精品h版在线观看| 欧美日韩成人免费| 国产精品福利片| 欧美一二三视频| 亚洲欧美日韩久久久久久| 色婷婷综合成人av| 92国产精品久久久久首页| 亚洲自拍偷拍色片视频| 欧美精品999|