面向對象編程 --- 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); //金毛