欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學(xué)習(xí)JavaScript設(shè)計(jì)模式(繼承)

 更新時(shí)間:2015年11月26日 14:36:45   作者:小平果118  
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計(jì)模式,其中重點(diǎn)介紹繼承,舉例說(shuō)明為什么需要繼承,對(duì)繼承進(jìn)行詳細(xì)剖析,感興趣的小伙伴們可以參考一下

1、繼承

在javascript中繼承是一個(gè)非常復(fù)雜的話題,比其他任何面向?qū)ο笳Z(yǔ)言的中的繼承都復(fù)雜得多。在大多數(shù)其他面向?qū)ο笳Z(yǔ)言中,繼承一個(gè)類只需要使用一個(gè)關(guān)鍵字即可。與它們不同,在javascript中要想達(dá)到傳承公用成員的目的,需要采取一系列措施。更有甚者,javascript屬于使用原型式繼承的少數(shù)語(yǔ)言之一。利益于這種語(yǔ)言的靈活性,你既可使用標(biāo)準(zhǔn)的基于類的繼承,也可使用更微妙一些的原型式繼承。

2、為什么需要繼承?

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

讓一個(gè)類繼承另一個(gè)類可能會(huì)導(dǎo)致二者產(chǎn)生強(qiáng)耦合,也即一個(gè)類的依賴于另一個(gè)類的內(nèi)部實(shí)現(xiàn)。我們將討論一些有助于避免這種問題的技術(shù),其中包括用摻元類為其他類提供方法這種技術(shù)。

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的對(duì)象 
   */</span> 
  Student.prototype = new Person(); 
  var stu1 = new Student("0001"); 
  stu1.name = '張三'; 
  stu1.age = '11'; 
  console.log(stu1.no); 
  stu1.say(); 
 </script> 

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

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

但是這種方式存在問題:

問題1:當(dāng)父類存在引用類型變量時(shí),造成數(shù)據(jù)不一致,下面我們給Person添加一個(gè)hobbies屬性,類型為數(shù)組。

<script type="text/javascript"> 
  /** 
  * 存在問題 
  * 1、無(wú)法在Student的構(gòu)造方法中傳遞參數(shù)用于父類的構(gòu)造方法 
  * 2、對(duì)于引用類型變量,造成數(shù)據(jù)不一致 
  */ 


  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> 

輸出結(jié)果:
張三 , 11 , soccer  
李四 , 12 , soccer,girl  
可以看出,李四的hobbies應(yīng)該只有g(shù)irl,但是上面的代碼讓所有對(duì)象共享了hobbies屬性。
上述的繼承方式還存在一個(gè)問題:

問題2:在Student的構(gòu)造方法中,無(wú)法使用new Student(“00001” , “張三” , 12) ;創(chuàng)建對(duì)象,并初始化name和age屬性,必須stu.name, stu.age進(jìn)行賦值

為了解決上述問題,對(duì)上述代碼進(jìn)行修改:

<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方法,第一個(gè)參數(shù)為上下文; 
   * 有點(diǎn)類似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的構(gòu)造方法中使用了Person.call(this,name,age)感覺就像super(name,age)【call的第一個(gè)參數(shù)為上下文】;并且成功解決了對(duì)引用屬性的共享問題,完美解決。

4、基于原型鏈的繼承

<script type="text/javascript"> 

 /** 
  * 基于原型鏈的集成中都是對(duì)象 
  * 存在問題: 
  * 1、對(duì)于引用類型變量,造成數(shù)據(jù)不一致 
  */ 
 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(); 

 /** 
  * 返回一個(gè)prototype執(zhí)行obj的一個(gè)對(duì)象 
  * @param obj 
  * @returns {F} 
  */ 
 function clone(obj) 
 { 
  var F = function () 
  { 
  }; 
  F.prototype = obj; 
  return new F(); 

 } 
</script> 

輸出:
zhangsan , 12 , Java  
lisi , 13 , Java,Javascript  
可以看出同樣存在引用屬性不一致的問題,并且整個(gè)操作全部基于對(duì)象,給人的感覺不是很好,下面通過圖解解釋下原理:

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

好了,已經(jīng)介紹完了,js的兩種集成的方式,最好使用的還是通過類的繼承,比較穩(wěn)定。

以上就是關(guān)于繼承知識(shí)點(diǎn)的相關(guān)內(nèi)容介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 使用JS組件實(shí)現(xiàn)帶ToolTip驗(yàn)證框的實(shí)例代碼

    使用JS組件實(shí)現(xiàn)帶ToolTip驗(yàn)證框的實(shí)例代碼

    這篇文章主要介紹了使用JS組件實(shí)現(xiàn)帶ToolTip驗(yàn)證框的實(shí)例代碼,需要的朋友可以參考下
    2017-08-08
  • js+數(shù)組實(shí)現(xiàn)網(wǎng)頁(yè)上顯示時(shí)間/星期幾的實(shí)用方法

    js+數(shù)組實(shí)現(xiàn)網(wǎng)頁(yè)上顯示時(shí)間/星期幾的實(shí)用方法

    在網(wǎng)頁(yè)上顯示時(shí)間(年月日/時(shí)分秒),很多新手朋友都想實(shí)現(xiàn)這樣的功能,本文整理了一些實(shí)用技巧,殺出來(lái)與大家分享,感興趣的朋友可以了解下
    2013-01-01
  • JavaScript 判斷對(duì)象中是否有某屬性的常用方法

    JavaScript 判斷對(duì)象中是否有某屬性的常用方法

    判斷對(duì)象中是否有某屬性的常見方式總結(jié),不同的場(chǎng)景要使用不同的方式。這篇文章給大家介紹了JavaScript 判斷對(duì)象中是否有某屬性的常用方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-06-06
  • 微信小程序以ssm做后臺(tái)開發(fā)的實(shí)現(xiàn)示例

    微信小程序以ssm做后臺(tái)開發(fā)的實(shí)現(xiàn)示例

    這篇文章主要介紹了微信小程序以ssm做后臺(tái)開發(fā)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • ES6中的class是如何實(shí)現(xiàn)的(附Babel編譯的ES5代碼詳解)

    ES6中的class是如何實(shí)現(xiàn)的(附Babel編譯的ES5代碼詳解)

    這篇文章主要介紹了ES6中的class是如何實(shí)現(xiàn)的?(附Babel編譯的ES5代碼詳解),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2019-05-05
  • javascript 二進(jìn)制運(yùn)算技巧解析

    javascript 二進(jìn)制運(yùn)算技巧解析

    javascript 中的二進(jìn)制運(yùn)算的一些技巧,曬出來(lái)和你們分享一下,希望可以幫助你們
    2012-11-11
  • 微信小程序的運(yùn)行機(jī)制與安全機(jī)制解決方案詳解

    微信小程序的運(yùn)行機(jī)制與安全機(jī)制解決方案詳解

    這篇文章主要介紹了微信小程序的運(yùn)行機(jī)制與安全機(jī)制解決方案,接觸小程序有一段時(shí)間了,總得來(lái)說(shuō)小程序開發(fā)門檻比較低,但其中基本的運(yùn)行機(jī)制和原理還是要懂的
    2023-02-02
  • JavaScript防抖與節(jié)流超詳細(xì)全面講解

    JavaScript防抖與節(jié)流超詳細(xì)全面講解

    在開發(fā)中我們經(jīng)常會(huì)遇到一些高頻操作,比如:鼠標(biāo)移動(dòng),滑動(dòng)窗口,鍵盤輸入等等,節(jié)流和防抖就是對(duì)此類事件進(jìn)行優(yōu)化,降低觸發(fā)的頻率,以達(dá)到提高性能的目的。本文就教大家如何實(shí)現(xiàn)一個(gè)讓面試官拍大腿的防抖節(jié)流函數(shù),需要的可以參考一下
    2022-10-10
  • 利用uni-app開發(fā)App的超簡(jiǎn)易教程

    利用uni-app開發(fā)App的超簡(jiǎn)易教程

    uni-app是一個(gè)使用Vue.js開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼,可發(fā)布到iOS、Android、Web(響應(yīng)式)、以及各種小程序,下面這篇文章主要給大家介紹了關(guān)于如何利用uni-app開發(fā)App的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 微信小程序如何刷新當(dāng)前界面的實(shí)現(xiàn)方法

    微信小程序如何刷新當(dāng)前界面的實(shí)現(xiàn)方法

    這篇文章主要介紹了微信小程序如何刷新當(dāng)前界面的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論