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

js繼承的這6種方式?。ㄉ希?/h1>
 更新時(shí)間:2019年04月23日 09:05:09   作者:一燈  
這篇文章主要介紹了js繼承方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

寫在前面

繼承的簡介

繼承”是JavaScript面向?qū)ο笤O(shè)計(jì)的重要一環(huán),愿你認(rèn)真讀完本文,吃透繼承的概念。

繼承的核心

1. 繼承方式一:原型鏈

1.1 介紹

原型鏈?zhǔn)菍?shí)現(xiàn)繼承最原始的模式,即通過prototype屬性實(shí)現(xiàn)繼承。

//父級-構(gòu)造函數(shù)
function Father() {
 this.fatherProp = true
}

//父級-原型屬性
Father.prototype.getFatherValue = function() {
 return this.fatherProp
}

//子級-構(gòu)造函數(shù)
function Son() {
 this.sonProp = false
}

//子級-原型屬性:繼承父級
//即__proto__指向父級的prototype
//若不理解請閱讀《一張圖徹底KO原型鏈(prototype,__proto__》
Son.prototype = new Father()

//子級-添加原型方法
Son.prototype.getSonValue = function() {
 return this.sonProp
}

//創(chuàng)建子級的實(shí)例對象
var son = new Son()
console.log(son.getFatherValue()) //true

1.2 解析:son實(shí)例對象是如何找到getFatherValue()方法的呢?

  1. 首先在son對象自身中找。若對象自身沒找到
  2. 然后在Son.prototype中找。若Son.prototype中沒找到
  3. 繼續(xù)往上一層,Son.prototype.__proto__(Fater.prototype)
  4. 依次類推,直到找到需要的屬性或方法,或到達(dá)原型鏈頂端Object.prototype

如果到最后都沒找到,會(huì)發(fā)生什么呢?

//一個(gè)不存在的方法
console.log(son.getValue()) //ERROE:not a function

1.3 注意事項(xiàng)

重寫父級原型鏈的方法或者添加父級原型鏈不存在的方法,必須在父級原型鏈代碼之后。(這個(gè)很好理解,不放代碼演示了)

通過原型鏈實(shí)現(xiàn)繼承后,不能再使用字面量的方式創(chuàng)建原型對象,因?yàn)闀?huì)覆蓋原型鏈。

//子級-原型屬性:繼承父級
Son.prototype = new Father()

//不能像下面這樣,這樣會(huì)使得上面的代碼無效
//因?yàn)檫@相當(dāng)于重新創(chuàng)建了一個(gè)原型對象
Son.prototype = {
 getSonValue: function() {
  return this.sonProp
 }
}

1.4 原型鏈實(shí)現(xiàn)繼承的弊端

世間萬事萬物都不可能十全而十美,原型鏈雖然強(qiáng)大,但也存在缺陷。

原型鏈中引用類型的屬性會(huì)被所有實(shí)例共享的,即所有實(shí)例對象使用的是同一份數(shù)據(jù),會(huì)相互影響。

 function Father() {
  this.arr = [1,2,3]
 }

 function Son() {
 }

 Son.prototype = new Father()

 var son1 = new Son()
 console.log(son1.arr) //1,2,3

 var son2 = new Son()
 son2.arr.push(4)

 console.log(son2.arr) //1,2,3,4
 console.log(son1.arr) //1,2,3,4

無法向父級構(gòu)造函數(shù)傳參

2. 繼承方式二:借用構(gòu)造函數(shù)

2.1 介紹

方式一中引用類型帶來的問題可借用構(gòu)造函數(shù)的方式解決。其核心思想是:在子級構(gòu)造函數(shù)中調(diào)用父級構(gòu)造函數(shù)。

如何實(shí)現(xiàn)在一個(gè)構(gòu)造函數(shù)中調(diào)用另一個(gè)函數(shù)?——call()和apply()

 function Father() {
  this.arr = [1,2,3]
 }

 function Son() {
  //call的第一個(gè)函數(shù)是this指向的對象,即構(gòu)造函數(shù)的實(shí)例對象
  Father.call(this)

  /*上面代碼等同于下面這段代碼:
  (function() {
   this.arr = [1,2,3]
  }).call(this)
  */
 }

 var son1 = new Son()
 console.log(son1.arr) //1,2,3

 var son2 = new Son()
 son2.arr.push(4)

 console.log(son2.arr) //1,2,3,4
 console.log(son1.arr) //1,2,3

//解決傳參問題:
function Father(name) {
 this.name = name
}

function Son(name) {
 Father.call(this, name)
}

var son1 = new Son("小名")
console.log(son1.name)  //小名

var son2 = new Son("一燈")
console.log(son2.name)  //一燈

2.2 借用構(gòu)造函數(shù)的缺陷

這種方式是通過構(gòu)造函數(shù)實(shí)現(xiàn)的,當(dāng)然也把構(gòu)造函數(shù)自身的問題帶過來了——破壞了復(fù)用性。因?yàn)槊總€(gè)實(shí)例都創(chuàng)建了一份副本。

3. 組合繼承

3.1 介紹

組合繼承 = 原型鏈 + 借用構(gòu)造函數(shù)。取其長避其短:共享的用原型鏈,各自的借用構(gòu)造函數(shù)

function Father(name) {
 this.name = name
 this.arr = [1,2,3]
}

Father.prototype.getName = function() {
 console.log(this.name)
}

function Son(name, age) {
 Father.call(this, name)
 this.age = age
}

Son.prototype = new Father()
Son.prototype.constructor = Son
Son.prototype.getAge = function() {
 console.log(this.age)
}

var son1 = new Son("小名", 23)
son1.arr.push(4)
console.log(son1.arr) //1,2,3,4
son1.getName()    //小名
son1.getAge()     //23

var son2 = new Son("一燈", 24)
console.log(son2.arr) //1,2,3
son1.getName()    //一燈
son1.getAge()     //24

3.2 解析

借用構(gòu)造函數(shù)部分:

Father.call(this, name)——name來自Father
this.age = age; Son.prototype.constructor = Son——age來自Son

原型鏈部分:

Father.prototype.getName——getName方法來自Father.prototype
Son.prototype.getAge——getAge來自Son.prototype

后記

關(guān)于繼承的后三種方式馬上推出,期待你的點(diǎn)贊&關(guān)注!

以上所述是小編給大家介紹的js繼承方式詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 原生JavaScript實(shí)現(xiàn)購物車效果

    原生JavaScript實(shí)現(xiàn)購物車效果

    這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)購物車效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 4個(gè)值得收藏的Javascript技巧

    4個(gè)值得收藏的Javascript技巧

    這篇文章主要介紹了4個(gè)值得收藏的Javascript技巧,文章首先通過變量轉(zhuǎn)字符串展開主題詳情,需要的小伙伴可以參考一下
    2022-07-07
  • echarts讀取JSON文件并畫圖完整代碼

    echarts讀取JSON文件并畫圖完整代碼

    Echarts官網(wǎng)上提供了很多圖表例子供我們白嫖,有時(shí)候遇到數(shù)據(jù)量比較大時(shí),它會(huì)向后臺(tái)請求json文件來加載圖表數(shù)據(jù),這篇文章主要給大家介紹了echarts讀取JSON文件并畫圖的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Js注冊協(xié)議倒計(jì)時(shí)的小例子

    Js注冊協(xié)議倒計(jì)時(shí)的小例子

    Js注冊協(xié)議倒計(jì)時(shí)的小例子,需要的朋友可以參考一下
    2013-06-06
  • js里面的變量范圍分享

    js里面的變量范圍分享

    今天寫一個(gè)滑動(dòng)自動(dòng)加載的功能的時(shí)候,遇到了切換就發(fā)現(xiàn)加載完畢的情況,查看了下發(fā)現(xiàn)可能是js的全局變量和局部變量的問題,自己測試了下,果不其然,下面分享下
    2020-07-07
  • 通過jQuery學(xué)習(xí)js類型判斷的技巧

    通過jQuery學(xué)習(xí)js類型判斷的技巧

    這篇文章主要介紹了通過jQuery學(xué)習(xí)js類型判斷的技巧,下面和小編一起來學(xué)習(xí)一下吧
    2019-05-05
  • 類似CSDN圖片切換效果腳本

    類似CSDN圖片切換效果腳本

    原來的腳本當(dāng)只有一張圖片時(shí)會(huì)彈出JavaScript腳本錯(cuò)誤,特此將自己修改完的版本貼出。
    2009-09-09
  • Canvas 制作動(dòng)態(tài)進(jìn)度加載水球詳解及實(shí)例代碼

    Canvas 制作動(dòng)態(tài)進(jìn)度加載水球詳解及實(shí)例代碼

    這篇文章主要介紹了Canvas 制作動(dòng)態(tài)進(jìn)度加載水球詳解及實(shí)例代碼的相關(guān)資料,這里附有實(shí)例代碼及實(shí)現(xiàn)效果圖,需要的朋友可以參考下
    2016-12-12
  • JavaScript中的class類詳解

    JavaScript中的class類詳解

    JavaScript?中的類(Class)是一種新的語言特性,它讓我們可以使用面向?qū)ο缶幊痰乃枷雭砀臃奖愕亟M織和管理代碼。在本文中,我們將詳細(xì)介紹?JavaScript?中的類特性,感興趣的同學(xué)可以借鑒閱讀
    2023-05-05
  • uniapp中input聚焦禁止軟鍵盤彈出方法

    uniapp中input聚焦禁止軟鍵盤彈出方法

    在使用uni-app完成掃碼功能時(shí),有時(shí)需要聚焦文本框的同時(shí),需要軟鍵盤消失,下面這篇文章主要給大家介紹了關(guān)于uniapp中input聚焦禁止軟鍵盤彈出的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評論