走火入魔 – javascript call apply 实现继承


上一博文说到了 javascript 中的原型继承,还说到了和大家分享 call , apply 实现继承,所以,就有了这篇博文.


我们还是定义一个person 类 和一个 student 类,如下

上面的student 类的构造函数传入了3个参数,当我们用call 实现 student 继承 person 的时候时,person的构造函数只实现了2个参数的传入,所以第三个参数必须要student自己来实现.及学生有了成绩的这个属性.

student 类还重新定义eat 方法,到底之类重写父类的方法时,父类的同名方法会不会被覆盖? call 能不能实现 student 继承 person ?  这些疑问一会我们看输出结果来揭晓.

 从结果我们可以一眼看到 student 确实继承了 person ,因为student 类里我们没有定义 sleep 方法,而输出结果可以看到 moke需要睡觉  ,当然睡觉是刚性需求,必须需要,哈哈.

也能看到 之类 student 重写父类的 eat 方法,结果之类的方法覆盖了父类的方法,输出结果是 moke吃学生餐.

而 student 自己定义的成绩属性 grade 通过新对象 s.grade 也输出了 85 .

认识一下call 方法

function.call(thisobj,args…)  他可以将指定函数作为 thisobj 对象的方法来调用,args 是指定函数需要的参数, 返回值是指定函数的返回值.

A.call(B,p1,p2)   简单理解为A替换B ,等价于 B(p1,p2)  所以实现了B继承A

加入A中有个方法 funA  而B 没有此方法,我们想在B对象中调用 A 的funA 方法,就可以用 call 来实现.

A.funA.call(B)   这样虽然B没有 funA 函数,但是依然可以通过call来使用. 间接地实现了给 B 类添加一个方法 funA .

apply(thisobj,args)   apply 方法和 call 方法实现的手段是一样的,但是唯一区别在于 call 传递的参数是(thisobj,p1,p2…..)   而 apply(thisobj,args)  args 为一个参数数组.


回到顶部