javascript - 关于call()方法中的this

查看:100
本文介绍了javascript - 关于call()方法中的this的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

在网上看到这样一段代码:

实现继承
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)这句话,可以知道两点:

  1. 她会执行Animal方法,并传入name作为参数

  2. 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,还会吃惊么?

这篇关于javascript - 关于call()方法中的this的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆