面向对象编程 --- this指向
一。首先:,编程
this的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
二。例如:app
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.this
var fun = obj.b; fun();
至关于,code
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调用时指的是被构造的对象。(io
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
。console
特殊:构造函数版this, 当this碰到return时。
(1).面向对象编程
function fn() { this.user = '金毛'; return {}; }; var a = new fn; console.log(a.user); //undefined
(2).function
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); //金毛