原型继承,借用构造函数继承,组合继承和拷贝继承
程序员文章站
2022-03-08 20:23:40
...
原型继承: 为了数据共享,改变原型指向,做到了继承,通过改变原型指向实现的继承。
//动物的构造函数
function Animal(name,weight) {
this.name=name;
this.weight=weight;
}
//动物的原型的方法
Animal.prototype.eat=function () {
console.log("天天吃东西,就是吃");
};
//狗的构造函数
function Dog(color) {
this.color=color;
}
Dog.prototype=new Animal("哮天犬","50kg");
Dog.prototype.bitePerson=function () {
console.log("哼~汪汪~咬死你");
};
//哈士奇
function ErHa(sex) {
this.sex=sex;
}
ErHa.prototype=new Dog("黑白色");
ErHa.prototype.playHost=function () {
console.log("哈哈~要坏衣服,要坏桌子,拆家..嘎嘎...好玩,开心不,惊喜不,意外不");
};
var erHa=new ErHa("雄性");
console.log(erHa.name,erHa.weight,erHa.color);
erHa.eat();
erHa.bitePerson();
erHa.playHost();
原型继承缺陷: 因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的,所以,这就是问题。如果想不一样,只能重新调用对象的属性进行重新赋值。
解决方案: 继承的时候,不用改变原型的指向,直接调用父级的构造函数的方式来为属性赋值就可以了------借用构造函数:把要继承的父级的构造函数拿过来,使用一下就可以了
借用构造函数: 构造函数名字.call(当前对象,属性,属性,属性…);
解决了属性继承,并且值不重复的问题
缺陷: 父级类别中的方法不能继承
//借用构造函数继承
function Person(name, age, sex, weight) {
this.name = name;
this.age = age;
this.sex = sex;
this.weight = weight;
}
Person.prototype.sayHi = function () {
console.log("您好");
};
function Student(name,age,sex,weight,score) {
//借用构造函数
Person.call(this,name,age,sex,weight);
this.score = score;
}
var stu1 = new Student("小明",10,"男","10kg","100");
console.log(stu1.name, stu1.age, stu1.sex, stu1.weight, stu1.score);
//如果调用方法的话会报错 借用构造函数继承的方法不能继承
//stu1.sayHi()//报错
var stu2 = new Student("小红",20,"女","20kg","120");
console.log(stu2.name, stu2.age, stu2.sex, stu2.weight, stu2.score);
var stu3 = new Student("小丽",30,"妖","30kg","130");
console.log(stu3.name, stu3.age, stu3.sex, stu3.weight, stu3.score);
组合继承: 原型继承和构造函数继承组合使用,发挥两者之长的一种继承方式。
原型继承虽然属性和方法都能继承,但是继承的时候初始化了属性,继承过来的属性的值都是一样的。构造函数继承只能解决了属性继承都是一样的问题,并且值不重复,但是父级类别中的方法不能继承。使用组合继承,属性和方法都能继承。
注意:使用组合继承,在改变原型指向的时候,就不用传入参数了
// 组合继承
function Person(name,age,sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
Person.prototype.sayHi=function () {
console.log("你好啊");
};
function Student(name,age,sex,score) {
//借用构造函数:属性值重复的问题
Person.call(this,name,age,sex);
this.score=score;
}
//改变原型指向----继承
Student.prototype=new Person();//不传值
Student.prototype.eat=function () {
console.log("吃东西");
};
var stu=new Student("小黑",20,"男","100分");
console.log(stu.name,stu.age,stu.sex,stu.score);
stu.sayHi();
stu.eat();
var stu2=new Student("小白",30,"女","101分");
console.log(stu2.name,stu2.age,stu2.sex,stu2.score);
stu2.sayHi();
stu2.eat();
拷贝继承: 把一个对象中的属性或者方法直接复制到另一个对象中
var obj1={
name:"小糊涂",
age:20,
sleep:function () {
console.log("睡觉了");
}
};
var obj2={};
for(var key in obj1){
obj2[key]=obj1[key];
}
console.log(obj2.name);
上一篇: Win11输入法切换不了怎么办?怎么设置win11输入法切换快捷键
下一篇: 冬至是什么意思
推荐阅读
-
javascript基于原型链的继承及call和apply函数用法分析
-
JS:构造函数继承原型链
-
js 继承 三种常用方法 原型链-借用构造函数-组合式继承
-
js继承、构造函数继承、原型链继承、组合继承、组合继承优化、寄生组合继承
-
在C++中子类继承和调用父类的构造函数方法
-
继承学习之类式继承、构造函数式继承、组合继承代码实例
-
javascript基于原型链的继承及call和apply函数用法分析
-
JavaScript 原型继承之构造函数继承_javascript技巧
-
C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容...
-
借用构造函数调用继承