js的几种继承,好记忆
程序员文章站
2024-01-30 10:59:04
...
继承
继承: 子类继承父类,子类产生的实力可以使用父类中的方法。
类式继承
核心: 将子类的原型指向父类的实例
注意: 给子类添加方法一定要在继承之后(因为原型链,指向的是父类的)
类式继承的缺点:
原型对象中多了没用的属性
原型对象中丢失了 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();
上一篇: 预处理 const sizeof