当前位置: 首页>编程语言>正文

js中call和原型链实现继承

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方法就能获取到了


https://www.xamrdz.com/lan/5tp2016368.html

相关文章: