因果关系记忆法:
因为原型链继承不能传参,所以有了构造继承,但是构造继承不能继承父级的原型,所以出现了结合两种方式的组合继承。
因为组合继承实例化了两次父类,性能有缺陷,强迫症的前端们忍不了,所以想出了原型式继承,再增强成寄生继承,把寄生继承跟组合继承一结合,变成了寄生组合继承,用来解决组合继承的小缺陷
来源:因果关系记忆法参考来源 https://blog.csdn.net/qq_38217940/article/details/124159897
1.构造函数继承 (无法继承父类原型链上的属性)
function Animal() {
this.type = '猫科动物';
}
function cat(name, age) {
this.name = name;
this.age = age;
Animal.call(this); //方法一:使用call方法继承
}
// cat.prototype = new Animal(); //方法2:使用prototype属性
cat.prototype.constructor = cat;
var cat = new cat('小猫', 2);
console.log(cat.type + cat.name + cat.age)
2.原型继承 (所有属性被共享,而且不能传递参数)
function person() {
this.sex = "男性"
}
function son(name, age) {
this.name = name;
this.age = age;
}
son.prototype = new person(); //原型继承
son.prototype.constructor = son;
var son = new son('小明', 23)
console.log(son.sex + son.name);
3.构造函数和原型的混合继承(组合式继承)
可以传参又继承了原型
//构造函数
function person1() {
this.name = "哈克"
}
function child() {
this.age = 23;
}
//原型继承,child函数继承了person函数的属性和方法
child.prototype = new person1();
//任何一个prototype对象都有一个constructor属性,指向它的构造函数,如果没有child.prototype = new
//person() 这句话, child.prototype.constructor是指向child的, 加入这行之后, child.prototype.constructor是指向person的
child.prototype.constructor = child;
//实例化child()函数
var demo = new child();
console.log(demo.name); //得到被继承的属性
//alert(demo.age)
4. es6继承方法(class继承)
//ES6引入了class类的概念,创建的每一个class类,都会有一个constructor()方法,该方法是一种用于创建和初始化class创建的对象的特殊方法--构造函数方法。
//constructor()方法里的 this 指向的是被创建的实例对象
class per { //class
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}
class Son extends per {
constructor(name, age) {
super(name) //类似java的继承方法
this.age = age;
}
}
var son = new Son("张三", 25);
console.log(son);
son.sayName(); //从per继承过来的方法
5.寄生组合继承 (解决构造函数继承无法继承原型的属性)
function animal(name) {
this.name = name;
this.sleep = function () {
console.log(this.name + "在睡觉");
}
}
//增加原型属性
animal.prototype.eat = function (food) {
console.log(this.name + '正在吃' + food);
}
function fish(name) {
animal.call(this, name); //构造继承父类
}
//创建一个没有实例的对象函数
var Super = function () {};
//为了使子类可以继承父类的原型属性; eat()方法
Super.prototype = animal.prototype;
fish.prototype = new Super(); //原型继承
fish.prototype.constructor = fish;
var fish = new fish("金鱼");
console.log(fish.name);
fish.sleep(); //从父类继承过来的
fish.eat('食物')