//===========es5中的继承 =============
function Person(){
this.name='David';//属性
this.age=20;
this.run=function(){//实例方法
console.log(this.name+'在运动');
}
}
// 在原型链上添加属性和方法 原型链上的属性会被多个实例共享,构造函数不会
Person.prototype.sex='男';
Person.prototype.work=function(){
console.log(this.name+'在工作');
}
//===========Per类继承Person类 ——对象冒充实现继承
function Per(){
Person.call(this); //对象冒充实现继承
}
var p1 = new Per();
p1.run();//可以执行 对象冒充可以继承构造函数里面的属性和方法
p1.work();//执行失败 对象冒充可以继承构造函数里面的属性和方法,但是没法继承原型链上的属性和方法
//===========Man类继承Person类 ——原型链继承
function Man(){
}
Man.prototype=new Person();//原型链实现继承 :既可以继承构造函数上的属性和方法,也可以继承原型链上的属性和方法
var m1=new Man();
m1.run();
m1.work();
//===========原型链继承的问题
function Person1(name,age){
this.name=name;//属性
this.age=20;
this.run=function(){//实例方法
console.log(this.name+'在运动');
}
}
// 在原型链上添加属性和方法 原型链上的属性会被多个实例共享,构造函数不会
Person1.prototype.sex='男';
Person1.prototype.work=function(){
console.log(this.name+'在工作');
}
var p2=new Person1('David',20);
p2.run();
p2.work();
function Man2(name,age){
}
Man2.prototype=new Person1();
var m2=new Man2('wendy',30);//实例化子类的时候没法给父类传参
m2.run();// 打印结果:undefined在运动
//===========原型链+对象冒充的组合继承模式
function Man3(name,age){
Person1.call(this,name,age);//对象冒充继承 实例化子类可以给父类传参
}
Man3.prototype=new Person1();
var m3=new Man3('wendy',30);
m3.run();
m3.work();
//===========原型链+对象冒充的组合继承模式 另一种写法
function Man4(name,age){
Person1.call(this,name,age);//对象冒充继承 实例化子类可以给父类传参
}
Man4.prototype=Person1.prototype;
var m4=new Man4('wendy4',40);
m4.run();
m4.work();