咱们先构建一个Person的构造函数函数
function Person(name) { this.name=name; } Person.prototype.sayHi=function () { console.log(this.name+",您好"); }
而后经过构建Student构造函数演示几种继承方式学习
1.经过原型链方式进行继承this
function Student(age){ this.age=age; }
Student.prototype.study1=function () { console.log("我热衷于学习"); }
Student.prototype=new Person(“张三”);//改变原型指向,指向Person的实例对象的__proto__ Student.prototype.study2=function () { console.log("我热衷于敲代码"); }
注意:使用此方式进行继承,在Student构造函数中添加原型方法应注意在改变原型指向后添加方法,上述代码中Student实例化后,Student的方式Study1调用失败study2才可调用成功spa
存在缺点:Person的实例化对象时name属性固定为“张三”,当屡次实例化Student对象时,致使继承的name属性一直为“张三”;prototype
2.在构造Student函数中使用call方式进行继承code
function Student(age,name) { this.age=age; Person.call(this,name);//经过call方式改变this指向 } Student.prototype.study=function () { console.log("学习"); }
存在缺点:此方式在Student实例化对象,能够调用Student原有方法study,可是没法调用Person构造函数中的方法对象
3.组合继承blog
function Student(age,name) { this.age=age; Person.call(this,name);//经过call方式改变this指向 } Student.prototype=new Person();//改变原型的指向 Student.prototype.study=function () { console.log("学习"); }
解决了上述两种方式出现的问题继承
4.拷贝继承原型链
var obj1={ name:"张三", age:16, sayHi:function () { console.log(this.name+",您好"); } } var obj2={}; for(var key in obj1){ obj2[key]=obj1[key]; } console.dir(obj2); console.dir(obj1);