js的原型繼承 -- prototype
先說下什么是prorotype?
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)建另外一個實(shí)例1: var boys1 = new Boy() boys1.house.push('深圳') //打印這兩個實(shí)例: console.log(boys, boys1)
可以看出來,當(dāng)屬性為引用類型時,只要有一個實(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í)例時無法向父類的構(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是子級;第二個參數(shù)apply可以接收一個數(shù)組,而call只能是每項逐個接收。
2.apply和call 本來就是為了擴(kuò)展函數(shù)的作用域而生的,換句話說就是為了改變this的指向存在的。
3.當(dāng)一個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)繼承多個父類,但是原型 prototype只能繼承一個父類!!!切記 } 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é):
以上所述是小編給大家介紹的js的繼承方法小結(jié)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com