1.首先创建一个由构造函数模拟出来的对象
function Sport(){
this.name = name;
this.time= time;
Sport.prototype.sport = function(){
alert("跑步");
}
}
Sport是由一个关于运动的类(构造函数模拟类)
2.我们在创建一个玩的类
function Paly(name,time,hobby){
this.hobby = hobby;
}
3.现在我们想让Play这个类继承自Sport这个父类的属性和方法,首先Sport中的属性值Paly可以通过call方法
让this指针指向发生改变,如下:
function Play (name,time,hobby){
this.hobby = hobby;
Sport.call(this,name,time);
}
var pl = new Play("运动",5,"长跑");
这样Sport中的this指针的指向就是调用Play这个对象了,而只需 对象名.属性名 就能获取到存放Sport类中的属性了但是Sport中存在原型中的方法这样是取不到的,即不可继承,那只有通过原型链的方式来实现继承Sport构造函数在创建时就生成了一个属于他的原型,并且在首次调用Sport时在该原型中添加了一个sport方法Play构造函数想要继承这个方法,通过自己实例化的对象去寻找原型调用这个sport是找不到的,因为sport方法不在Play所属的原型中所以找不到,那怎么才能找到呢?首先可以让Play构造函数指向他自己的原型改变成指向Sport类实例化的对象即让Sport类实例化的对象充当Play的原型
var sp = new Sport();
Play.prototype = sp;
这样就可以通过Sport实例化的对象去找到他的原型中的sport方法。但是这样Play中的原型相当于是Sport实例化的对象那他的constructor指向就是指的Sport这个构造函数了,而不再是Play构造函数。为了修改这个逻辑上的错误可以把Play构造函数在赋值回去即
Play.prototype = Play;
这样就可以通过pl.sport继承到Sport原型中方法啦,当然这个使用原型链层层向上找的结果,而属性值就完全可以通过call方法就能获取到了