走火入魔 – 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 为一个参数数组.