在网上看到这样一段代码:
实现继承
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.call(this, name);
}
var cat = new Cat("Black Cat");
cat.showName();
Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.
对于其中一句话不是很理解:“ Animal.call(this) 的意思就是使用 Animal对象代替this对象”。
我在犀牛书中看到,call()和apply()的第一个参数是要调用函数的母对象,它是调用上下文,函数体内通过this来获得它的引用。
在上面代码中,Animal是要调用的函数,而它没有被封装作为某个对象的属性,那么Animal的母对象不就是global对象吗?为何代码中的解释却是this指向Animal对象呢?
好吧,我们首先来看下
new
做了什么:根据我选中部分的描述,我们知道
new Cat("Black Cat")
之后,Cat
里面的this
关键字,就指向了Cat
实例本身。然后再来看
call
又是怎么回事:仍然注意我选中的部分,
thisArg
(你的例子中就是Animal.call(this, name)
里的this
),fun
(你的例子中就是Animal.call(this, name)
里的Animal
)。由此我们对
Animal.call(this, name)
这句话,可以知道两点:她会执行
Animal
方法,并传入name
作为参数Animal
方法里写的this
会被call(this
里的this
(实际是Cat
实例对象,上面刚讲的)替换掉那你再想想,
Animal
方法里写的this.name = name;
和this.showName = function(){ alert(this.name); }
是什么意思?其实就是cat.name = name;
和cat.showName = function(){ alert(cat.name); }
现在再看到
cat.showName();
居然能弹出来Black Cat
,还会吃惊么?