浅谈JS中this关键字指向的对象
学习js三个月了,现在来谈一下this
关键字,做个总结。
java中的this
因为之前是码java
的,所以我想和之前的OO
语言做个比较。所以如果之前你敲过java
,对这样的代码应该不会陌生:
|
|
当一个对象创建后,Java
虚拟机(JVM
)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this
。上个例子中,如果你创建了一个Test
的实例对象,那它就是Test
对象的引用。
当然还有这样的:
|
|
这个例子是用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。
js中的this
因为之前的概念,所以搞了很久才接受js
中的this
。总之,就是一句话,关键字 this
总是指向调用该方法的对象。这句话,看上去很简单,但我想举几个例子,以便有个更好的记忆。
- example 1:
|
|
- example 2:
|
|
- example 3:
|
|
- example 4:
|
|
- example 5:
|
|
- example 6:
|
|
先说一下答案:
- global
- Object
- Person
- global
- global
- Object
始终记住一句话,关键字 this
总是指向调用该方法的对象!你可以像记右手法则来记它,并用它来判断。
首先看第一个,你可以理解为无人调用它(函数调用),如果无人调用,那它指的就是
global
,就这样。第二个,因为是
Person
调用了hehe
方法(方法调用),Person
是一个Object
,所以是Object
,完毕。第三个,new关键字来了,其实new关键字是做了一些工作的,这里简单说一下,比如var person =new Person(),那么它其实这样做了:
1234var Person=function () {this=Object.create(Person.prototype); //new的时候创建一个Person的原型对象并返回return this;};
可能你会问怎么能允许给this
赋值呢?是的,我们没有这样的能力,但js的解释器是有这样的能力的。
所以答案是Person
。
第四个,放到一个事件方法里了,有些可能就以为有些“猫腻”了,甚至觉得指向
node
=。=,其实前面加再多都没卵用,始终一句话,this
总是指向调用该方法的对象。无人调用(函数调用)hehe
,那就是global
。第五个,还是在一个事件方法里,只不过,
hehe
前面加了个Person.
。所以如果觉得这里的this
指的是Person
的话,还是先去把方法
和方法被调用
这两个概念搞清楚。之前码java的,都没接触过方法可以作为参数,但Person.hehe
和Person.hehe()
不是一码事。最后一个,也许就是就是上一个例子里,你想要的答案=。=,这次不是直接写了,而是放到一个
function
内,再由Person
来调用hehe
,这次,没得说了吧,this
指的就是Object
了。
说了这些,其实都不如这一句话,this
总是指向调用该方法的对象。