js的原型繼承 -- prototype數組
先說下什麼是prorotype?
bash
new
出來的都是函數對象;不然就是普通對象prototype
(原型對象);而普通對象則只有__proto__
(原型指針)eg: (prototype的繼承)
//建立父類函數對象
function Personal(name, age) {
this.name = name; //父類的私有屬性
this.age = age;
this.house = ['北京', '上海']
}
Personal.prototype.run = function() { //給父類原型動態添加方法
alert('原型方法:' + this.name + ' is running!');
}
var per = new Personal('小白', 24)
per.run() //打印 --> 原型方法:小白 is running!
//建立子類函數對象
function Boy() {}
Boy.prototype = new Personal('小黑', 19) //子類繼承父類的全部屬性和方法
Boy.prototype.source = 100 //給子類添加原型屬性
Boy.prototype.printSource = function() { //給子類添加方法
alert(this.name + '的原型方法printSouce打印成績爲:' + this.source) //小黑的原型方法printSouce打印成績爲:100
}
Boy.prototype.run() //打印 --> 原型方法:小黑 is running!
var boys = new Boy()
boys.printSource()
console.log(boys, '--boys---') //打印 -->19, 小黑, 100 (這裏會沿着prototype向上查找到Personal的屬性)
複製代碼
如下是關於prototype繼承須要注意的點:微信
//建立另一個實例1:
var boys1 = new Boy()
boys1.house.push('深圳')
//打印這兩個實例:
console.log(boys, boys1)
複製代碼
能夠看出來,當屬性爲引用類型時,只要有一個實例的屬性作了操做,全部的實例都會受到影響。app
Boy.prototype = new Personal();
Boy.prototype.constructor === Personal; // true
// 重寫 Boy.prototype 中的 constructor 屬性,指向本身的構造函數 Boy
Boy.prototype.constructor = Boy;
複製代碼
function Boy() {}
Boy.prototype = new Personal();
// 給子類添加原型方法必須在替換原型以後
Boy.prototype.printSource = function() {
console.log('printSource~');
};
複製代碼
const boys = new Boy();
// 只能建立實例以後再修改父類的屬性
boys.source = 100;
複製代碼
apply()、call()方法的繼承函數
瞭解下apply()、call()方法
this
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
複製代碼
obj是父級,thisObj是子級;第二個參數apply能夠接收一個數組,而call只能是每項逐個接收。spa
//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()方法實現:
function Girls(name, sex) {
Personal.apply(this, [name, sex]);
//Person.apply(this,arguments); //跟上句同樣的效果,arguments
//Print.apply(this,arguments); //還能夠實現繼承多個父類,可是原型 prototype只能繼承一個父類!!!切記
}
const girls1 = new Girls('Lucy', '女')
girls1.say();
//call()實現:
function Boy(name, sex) {
Personal.call(this, name, sex);
}
const boys = new Boy('Barry', '男');
boys.say() //
複製代碼
總結:prototype
若是以爲對你有幫助,請給做者一點小小的鼓勵,點個贊或者收藏吧。
(有須要溝通的請聯繫我:微信( wx9456d ) 郵箱( allan_liu986@163.com )指針