国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:58:24
文檔

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

js的繼承方法小結(jié)(prototype、call、apply)(推薦):js的原型繼承 -- prototype 先說下什么是prorotype? js中,俗話說一切皆對象。用new 出來的都是函數(shù)對象;否則就是普通對象 函數(shù)對象都有prototype(原型對象);而普通對象則只有__proto__(原型指針) 函數(shù)對象的一個(gè)特點(diǎn):可以實(shí)現(xiàn)不同類之間的方法
推薦度:
導(dǎo)讀js的繼承方法小結(jié)(prototype、call、apply)(推薦):js的原型繼承 -- prototype 先說下什么是prorotype? js中,俗話說一切皆對象。用new 出來的都是函數(shù)對象;否則就是普通對象 函數(shù)對象都有prototype(原型對象);而普通對象則只有__proto__(原型指針) 函數(shù)對象的一個(gè)特點(diǎn):可以實(shí)現(xiàn)不同類之間的方法

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() { //給父類原型動態(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 (這里會沿著prototype向上查找到Personal的屬性)

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

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

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

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

2.該方式導(dǎo)致 Boy.prototype.constructor 被重寫,它指向的是 Personal 而非 Boy。因此你需要手動將 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 放在重寫原型對象之前會被覆蓋掉,因此給子類添加原型方法必須在替換原型之后(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是父級,thisObj是子級;第二個(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可以動態(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é)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

js的繼承方法小結(jié)(prototype、call、apply)(推薦):js的原型繼承 -- prototype 先說下什么是prorotype? js中,俗話說一切皆對象。用new 出來的都是函數(shù)對象;否則就是普通對象 函數(shù)對象都有prototype(原型對象);而普通對象則只有__proto__(原型指針) 函數(shù)對象的一個(gè)特點(diǎn):可以實(shí)現(xiàn)不同類之間的方法
推薦度:
標(biāo)簽: call js 繼承
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 久久亚洲一级α片 | 亚洲国产欧美自拍 | 久久免费看视频 | 国产一区二区精品久久91 | 成人国内精品久久久久影院 | 亚洲一区二区综合 | 精品日韩在线 | 国产女同一区二区三区五区 | 97伊人久久 | 国产国拍亚洲精品永久不卡 | 99久久精品免费国产一区二区三区 | 亚洲第一视频区 | 欧美区在线 | 91日韩| 国产福利一区二区 | 国产精品高清久久久久久久 | 日韩欧美在线综合网 | 欧美在线一二三区 | 欧美激情伦妇在线观看 | 国产精品伦视频观看免费 | 成人国产一区二区三区精品 | 国产高清美女一级a毛片 | 中文字幕欧美日韩 | 国产精品美女久久久久 | 亚洲欧美中文日韩综合 | 九九精品视频一区在线 | 精品视频在线观看一区二区三区 | 欧美一区二区在线视频 | 国产在线观看一区二区三区 | 国产成人精品免费视频大全可播放的 | 亚洲欧洲在线观看 | 好看的电影网站亚洲一区 | 国产精品视频一区二区三区不卡 | 青草视频在线观看免费 | 亚洲 欧美 中文 日韩专区 | 国产精品一区欧美日韩制服 | 五月婷婷丁香 | 国产成人欧美一区二区三区的 | 一区二区不卡久久精品 | 美国一级大黄大色毛片 | 国产第一页在线视频 |