1、原型继承
存在的问题:继承是通过改变原型指向实现的。但是这种继承方式存在缺陷,就是这样直接初始化了属性值,想要改变属性值只能通过对象调用属性的方式进行重新赋值。
解决方案:借用构造函数。
2、借用构造函数
//父类构造函数
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayHi=function(){
console.log("你好");
};
//子类构造函数
function Student(name,age,score){
Person.call(this,name,age);
this.score=score;
}
var stu=new Student("张猪",18,100);
console.log(stu.name,stu.age,stu.score);
// stu.sayHi();这个会报错,无法实现。
这种方式可以解决了属性继承的问题,可以实现不会重复的问题
缺陷:但是无法调用父类的方法。
3、组合继承
组合继承就是原型继承+借用构造函数继承。解决了借用构造函数继承无法调用父类方法的问题。
//父类构造函数
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayHi=function(){
console.log("你好");
};
//子类构造函数
function Student(name,age,score){
Person.call(this,name,age);
this.score=score;
}
Student.prototype=new Person();
var stu=new Student("张猪",18,100);
console.log(stu.name,stu.age,stu.score);
//组合继承可以调用父类的方法
stu.sayHi();
4、拷贝继承
拷贝继承就是将一个对象的属性和方法还有其他东西直接遍历复制到另一个对象中去。
下面是浅拷贝。
//拷贝继承
function Person(){
}
Person.prototype.name="张猪";
Person.prototype.sayHi=function(){
console.log("你好");
};
//空对象
var pe2={};
//构造函数中的原型prototype也是对象
for(var key in Person.prototype){
pe2[key]=Person.prototype[key];
}
console.dir(pe2);
pe2.sayHi();
网友评论