面向对象编程 --- this指向
一。起首:,
this的指向在函数定义的时刻是肯定不了的,只要函数实行的时刻才肯定this究竟指向谁,实际上this的终究指向的是谁人挪用它的对象。
二。比方:
var obj = {
a : 1,
b : function() {
console.log(this.a)
}
}
当 obj.b()
时,会输出1
;
当 var fun = obj.b; fun()
时,会输出undefined
。
三。缘由:
1.obj.b()
这里的this
指向的是对象o
,由于你挪用这个fn
是经由过程o.fn()
实行的,那天然指向就是对象o
。
2.
var fun = obj.b;
fun();
相当于,
var b = function(){
console.log(this.a)
};
obj = {
a:1,
b:b
};
var fun = obj.b;
fun();
虽然fun
是obj.b
的一个援用,然则实际上,他援用的是b
函数自身,因而此时的fun()
实际上是一个不带任何润饰的函数挪用,只是在将fn
赋值给变量j
的时刻并没有实行所以终究指向的是window
。
四。总结: this
的值要比及代码真正实行是才肯定。
同时,this的值有以下几种状况:
1.new挪用时指的是被组织的对象。(
function Fn(){
this.user = '猫咪'
};
var a = new Fn();
consle.log(a.user); //猫咪
这里之所以对象a
能够点出函数Fn
内里的user
是由于new
关键字能够转变this
的指向,将这个this
指向对象a
,为何我说a
是对象,由于用了new
关键字就是建立一个对象实例,我们这里用变量a
建立了一个Fn
的实例[相当于复制了一份Fn
到对象a
内里],此时仅仅只是建立,并没有实行,而挪用这个函数Fn
的是对象a
,那末this
指向的天然是对象a
,那末为何对象a
中会有user
,由于你已复制了一份Fn
函数到对象a
中,用了new
关键字就等同于复制了一份。)
2.call
,apply
挪用,只想我们指定的对象(后续更新)。
3.对象挪用,如实行obj.b()
,this
指向obj
。
4.默许的,指向全局变量window
。
特别:组织函数版this, 当this遇到return时。
- 举例:
(1).
function fn() {
this.user = '金毛';
return {};
};
var a = new fn;
console.log(a.user); //undefined
(2).
function fn() {
this.user = '金毛';
return function(){};
};
var a = new fn;
console.log(a.user); //undefined
(3).
function fn() {
this.user = '金毛';
return 1;
};
var a = new fn;
console.log(a.user); //金毛
(4).
function fn() {
this.user = '金毛';
return undefined;
};
var a = new fn;
console.log(a.user); //金毛
2.总结:假如返回值是一个对象,那末this指向的就是谁人返回的对象,假如返回值不是一个对象那末this照样指向函数的实例。
3.特别:虽然null也是对象,然则在这里this照样指向谁人函数的实例,由于null比较特别。
function fn() {
this.user = '金毛';
return null;
};
var a = new fn;
console.log(a.user); //金毛