亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js的繼承方法小結(jié)(prototype、call、apply)(推薦)

 更新時(shí)間:2019年04月17日 14:38:57   作者:跟風(fēng)少年  
這篇文章主要介紹了js的繼承方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

js的原型繼承 --  prototype

先說下什么是prorotype?

  1. js中,俗話說“一切皆對象”。用new 出來的都是函數(shù)對象;否則就是普通對象
  2. 函數(shù)對象都有prototype(原型對象);而普通對象則只有__proto__(原型指針)
  3. 函數(shù)對象的一個(gè)特點(diǎn):可以實(shí)現(xiàn)不同類之間的方法繼承
  4. 函數(shù)的子類可以共享父類的方法,而父類不能想用子類的方法
eg: (prototype的繼承)
 
 //創(chuàng)建父類函數(shù)對象  
 function Personal(name, age) {
  this.name = name;   //父類的私有屬性
  this.age = age;
  this.house = ['北京', '上海']
 }
 Personal.prototype.run = function() {  //給父類原型動(dòng)態(tài)添加方法
  alert('原型方法:' + this.name + ' is running!');
 }
 var per = new Personal('小白', 24)
 per.run() //打印 --> 原型方法:小白 is running!
 
 //創(chuàng)建子類函數(shù)對象
 function Boy() {}
 Boy.prototype = new Personal('小黑', 19) //子類繼承父類的所有屬性和方法
 Boy.prototype.source = 100      //給子類添加原型屬性
 Boy.prototype.printSource = function() { //給子類添加方法
  alert(this.name + '的原型方法printSouce打印成績?yōu)椋? + this.source) //小黑的原型方法printSouce打印成績?yōu)椋?00
 }
 Boy.prototype.run()  //打印 --> 原型方法:小黑 is running!
 var boys = new Boy()
 boys.printSource()
 console.log(boys, '--boys---') //打印 -->19, 小黑, 100 (這里會(huì)沿著prototype向上查找到Personal的屬性)

以下是關(guān)于prototype繼承需要注意的點(diǎn):

1.如果父類中有引用類型的屬性:Array,Object等。子類繼承了這些屬性,并嘗試改變的話,會(huì)影響到父類的屬性。

//創(chuàng)建另外一個(gè)實(shí)例1:
   var boys1 = new Boy()
   boys1.house.push('深圳')
//打印這兩個(gè)實(shí)例:
   console.log(boys, boys1)

可以看出來,當(dāng)屬性為引用類型時(shí),只要有一個(gè)實(shí)例的屬性做了操作,所有的實(shí)例都會(huì)受到影響。

2.該方式導(dǎo)致 Boy.prototype.constructor 被重寫,它指向的是 Personal 而非 Boy。因此你需要手動(dòng)將 Boy.prototype.constructor 指回 Boy。

Boy.prototype = new Personal();
Boy.prototype.constructor === Personal; // true

// 重寫 Boy.prototype 中的 constructor 屬性,指向自己的構(gòu)造函數(shù) Boy
Boy.prototype.constructor = Boy;

3.因?yàn)?Boy.prototype = new Personal(); 重寫了 Boy 的原型對象,所以 printSource 放在重寫原型對象之前會(huì)被覆蓋掉,因此給子類添加原型方法必須在替換原型之后(eg是沒有被覆蓋的)。

function Boy() {}
Boy.prototype = new Personal();

// 給子類添加原型方法必須在替換原型之后
Boy.prototype.printSource = function() {
 console.log('printSource~');
};


4.創(chuàng)建 boys 實(shí)例時(shí)無法向父類的構(gòu)造函數(shù)傳參,也就是無法初始化 source屬性。因此:只能創(chuàng)建實(shí)例之后再修改父類的屬性。

const boys = new Boy();

// 只能創(chuàng)建實(shí)例之后再修改父類的屬性
boys.source = 100;

apply()、call()方法的繼承

了解下apply()、call()方法

1.apply()、call()的用法:

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

obj是父級(jí),thisObj是子級(jí);第二個(gè)參數(shù)apply可以接收一個(gè)數(shù)組,而call只能是每項(xiàng)逐個(gè)接收。

2.apply和call 本來就是為了擴(kuò)展函數(shù)的作用域而生的,換句話說就是為了改變this的指向存在的。

3.當(dāng)一個(gè)object沒有某種方法,但是其他的有,我們可以借助call和apply來用其他對象的方法來做操作,也可以傳參數(shù)。

//eg:
function Personal(name, sex) {
   this.name = name;
   this.sex = sex;
   this.say = function (){
    alert('姓名:' + this.name + ';性別:' + this.sex)
   }
  }
  const per = new Personal('Allan', '男')
  per.say();
  
//apply()方法實(shí)現(xiàn):
  function Girls(name, sex) {
   Personal.apply(this, [name, sex]);
   //Person.apply(this,arguments); //跟上句一樣的效果,arguments 
   //Print.apply(this,arguments); //還可以實(shí)現(xiàn)繼承多個(gè)父類,但是原型 prototype只能繼承一個(gè)父類!?。∏杏?
  }
  const girls1 = new Girls('Lucy', '女')
  girls1.say();
  
//call()實(shí)現(xiàn):
  function Boy(name, sex) {
   Personal.call(this, name, sex);
  }
  const boys = new Boy('Barry', '男');
  boys.say() //

總結(jié):

  1. prototype可以動(dòng)態(tài)的給對象增加屬性和方法。
  2. 可以實(shí)現(xiàn)子類繼承父類,擁有父類的屬性和方法。
  3. call和apply的區(qū)別,在于參數(shù)的不同。
  4. call和apply,理解為在子類的運(yùn)行環(huán)境中執(zhí)行父類的方法和屬性。
  5. call和apply可以實(shí)現(xiàn)一個(gè)子類繼承多個(gè)父類,但是prototype只能有一個(gè)父類。

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

相關(guān)文章

  • js數(shù)據(jù)類型以及其判斷方法實(shí)例

    js數(shù)據(jù)類型以及其判斷方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于js數(shù)據(jù)類型以及其判斷方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 效果直逼flash的Div+Css+Js菜單

    效果直逼flash的Div+Css+Js菜單

    效果直逼flash的Div+Css+Js菜單...
    2007-05-05
  • 全面解析JavaScript中offsetLeft、offsetTop的用法

    全面解析JavaScript中offsetLeft、offsetTop的用法

    本文主要介紹了全面解析JavaScript中offsetLeft、offsetTop的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦栴}的解決方法

    url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦栴}的解決方法

    下面小編就為大家?guī)硪黄猽rl傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦栴}的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • 關(guān)于Javascript中defer和async的區(qū)別總結(jié)

    關(guān)于Javascript中defer和async的區(qū)別總結(jié)

    相信看過javascript高級(jí)程序設(shè)計(jì)的人,在javascript高級(jí)程序設(shè)計(jì)里,應(yīng)該看到了介紹了有關(guān)defer和async的區(qū)別,可是比較淺顯,而且也說得不是很清楚。下面我們來通過這篇文章來詳細(xì)了解下dfer和async的區(qū)別。
    2016-09-09
  • Javascript引用指針使用介紹

    Javascript引用指針使用介紹

    Javascript引用指針使用介紹,需要的朋友可以參考下
    2012-11-11
  • js隱式轉(zhuǎn)換的知識(shí)實(shí)例講解

    js隱式轉(zhuǎn)換的知識(shí)實(shí)例講解

    在本篇文章中,小編給大家分享了關(guān)于js隱式轉(zhuǎn)換的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考學(xué)習(xí)下。
    2018-09-09
  • Bootstrap選項(xiàng)卡動(dòng)態(tài)切換效果

    Bootstrap選項(xiàng)卡動(dòng)態(tài)切換效果

    這篇文章主要為大家詳細(xì)介紹了Bootstrap選項(xiàng)卡動(dòng)態(tài)切換效果,點(diǎn)擊登錄和注冊可以實(shí)現(xiàn)任意切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 圖片onload事件觸發(fā)問題解決方法

    圖片onload事件觸發(fā)問題解決方法

    當(dāng)頁面上存在一個(gè)圖片元素時(shí)如:<img src='xxxx' alt="" />,頁面加載中ie7、8跟chrome下圖片的onload事件非常奇怪,有后完全不觸發(fā),有時(shí)候觸發(fā)后進(jìn)行改變某些元素的操作,操作結(jié)果無效。
    2011-07-07
  • ExtJs異步無法向外傳值和賦值的完美解決辦法

    ExtJs異步無法向外傳值和賦值的完美解決辦法

    這篇文章主要介紹了ExtJs異步無法向外傳值和賦值的完美解決辦法,需要的朋友可以參考下
    2017-06-06

最新評論