这几天在看廖雪峰老师的js教程,在提到this的指向问题时,讲到了apply改变this指向的作用。
getAge.apply(xiaoming, []); // 25, getAge()里的this指向xiaoming, 参数为空
(以上摘自廖雪峰老师js教程-函数-方法篇)
后来又看了继承相关的内容,用到了call和apply,这两个函数只有一点不同,前者按顺序传递参数,后者参数必须为数组。
但当时没有完全理解,感觉像是call和apply的新用法?以getAge为例,为什么说xiaoming继承了getAge方法?
网上看了一些举例,这个感觉很不错:
function fun1() {
this.a = 123;
this.add = function () { return this.a }
}
function fun2() {
this.a = 456;
}
var f1=new fun1()
var f2=new fun2()
var a = f1.add.call(f2); // a输出的是456
这里可以发现,f2这个对象使用了f1的add方法,从而return了f2里的a值,可以理解为,f2继承了f1的add方法。用改变this指向的概念,则解释为:f1.add()里的this指向了f2,所以a值成为了456(如果没有改变this的指向,直接调用f1.add()会报错)
总之,本质是改变this的指向,在表面上我们称之继承,只是为了配合众多面向对象语言里的继承概念(所谓js不可出大流,不然没人愿意用啊)
但我还是想说,这tm对于初学者真够绕的,mmp!
参考资料:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345005399057070809cfaa347dfb7207900cfd116fb000
http://www.cnblogs.com/itstone/archive/2012/07/23/call.html
如侵删