es5继承
原型链继承:让子类的原型等于父类的原型
//woker 子类 person 父类
( Worker.prototype=Person.prototype;)
原型链继承有浅拷贝的问题,比如:
Worker.prototype.FnJob=function(){
return this.job;
}
给子类的原型添加方法时,父类的原型也会有这个子类添加的方法
function Person(name,age){ // es5;
this.name=name;
this.age=age;
} // 定义是一个类 同时他也是构造函数
Person.prototype.FnName=function(){ // 通过原型给类加上方法
return this.name;
}
Person.prototype.FnAge=function(){
return this.age;
}
function Worker(name,age,job){
Person.call(this,name,age,job); // 通过函数的标准调用
this.job=job;
}
const W1=new Worker('李四',18,'搬砖');
Worker.prototype=Person.prototype;
Worker.prototype.FnJob=function(){
return this.job;
}
拷贝式继承
将父的原型重新定义为一个json,for in 循环这个json,让json里面的每一项都赋值给子类的原型,这样的话 给子类的原型添加方法时就不会有浅拷贝的问题
function Person(name,age){ // es5;
this.name=name;
this.age=age;
} // 定义是一个类 同时他也是构造函数
Person.prototype.FnName=function(){ // 通过原型给类加上方法
return this.name;
}
Person.prototype.FnAge=function(){
return this.age;
}
function Worker(name,age,job){
Person.call(this,name,age,job); // 通过函数的标准调用
this.job=job;
}
const W1=new Worker('李四',18,'搬砖');
const json=Person.prototype;
//拷贝式继承
for(var name in json){
Worker.prototype[name]=json[name]
}
Worker.prototype.FnJob=function(){
return this.job;
}
寄生式继承
让子类的原型等于父类的一个实例(Worker.prototype=new Person()),然后让子类的原型的constructor等于子类(Worker.prototype.constructor=Worker)
这就是寄生式继承
function Person(name,age){ // es5;
this.name=name;
this.age=age;
} // 定义是一个类 同时他也是构造函数
Person.prototype.FnName=function(){ // 通过原型给类加上方法
return this.name;
}
Person.prototype.FnAge=function(){
return this.age;
}
function Worker(name,age,job){
Person.call(this,name,age,job); // 通过函数的标准调用
this.job=job;
}
// 寄生式继承
Worker.prototype=new Person();
// 设置子类的构造函数时自身的构造函数,以防止因为设置原型而覆盖构造函数
Worker.prototype.constructor=Worker;
Worker.prototype.FnJob=function(){
return this.job;
}
const W1=new Worker('李四',18,'搬砖');