繼承
繼承: 子類繼承父類,子類產生的實力可以使用父類中的方法。
類式繼承
核心: 將子類的原型指向父類的實例
注意: 給子類添加方法一定要在繼承之後(因爲原型鏈,指向的是父類的)
類式繼承的缺點:
原型對象中多了沒用的屬性
原型對象中丟失了 constructor 屬性
重複賦值過程
function People(name, age) {
this.name = name;
this.age = age;
}
People.prototype.say = function(){
console.log("我是"+ this.name);
}
function Child(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
// 類式繼承 將子類的原型指向父類的實例
Child.prototype = new People();
var xiaoming = new Child('小明')
xiaoming.say();
爲了解決他的缺點。 解決constructor
缺少 contructor。可以手動添加一個。
Child.prototype.contructor = Child;
解決 重複賦值的過程
首先提一下,爲什麼多出來無用屬性。 如果父類的屬性和子類的屬性有相同的。那麼就重複賦值。但是會用子類的屬性。 (就近)
構造函數繼承(不是真正的繼承)
繼承是子類使用父類的方法,構造函數繼承是不能的
function People(name, age) {
this.name = name;
this.age = age;
}
People.prototype.say = function(){
console.log("我是"+ this.name);
}
function Child(name, age, sex) {
//構造函數繼承
People.apply(this, arguments);
this.sex = sex;
}
var xiaoming = new Child('小明')
xiaoming.say();
子類是不能調用父類的方法,所以他不是 真正的繼承。
組合繼承
類式繼承+ 構造函數繼承
function People(name, age) {
this.name = name;
this.age = age;
}
People.prototype.say = function(){
console.log("我是"+ this.name);
}
function Child(name, age, sex) {
//構造函數繼承
People.apply(this, arguments);
this.sex = sex;
}
// 類式繼承 將子類的原型指向父類的實例
Child.prototype = new People();
var xiaoming = new Child('小明')
xiaoming.say();
解決 多出來無用屬性
爲什麼會多出來無用屬性呢, 是 因爲 子類的 原型 指向 父類的實例, 父類是有方法體的, 實例化的時候,就會有方法體中所有屬性。 所以要解決這個, 需要一個空方法體的函數, 來做這個中間件。
寄生式繼承
function People(name, age) {
this.name = name;
this.age = age;
}
function Child(name) {
this.name = name;
}
// 寄生式繼承
function JiSheng(Child, Perple) {
function F(){};
F.prototype = People.prototype;
Child.prototype = new F();
}
JiSheng(Child, People);
People.prototype.say = function() {
console.log('我要'+ this.name + "說話");
}
var xiaoming = new Child('小明');
xiaoming.say();
寄生式組合繼承
寄生式+ 構造函數
function People(name) {
this.name = name;
}
function Child(name, age) {
People.apply(this, arguments);
this.age = age;
}
// 寄生式繼承
function JiSheng(Child, Perple) {
function F(){};
F.prototype = People.prototype;
Child.prototype = new F();
}
JiSheng(Child, People);
People.prototype.say = function() {
console.log('我要'+ this.name + "說話");
}
var xiaoming = new Child('小明');
xiaoming.say();