2011-11-28 82 views
37

我想知道,在JavaScript函數中做什麼「返回這個」呢,它的目的是什麼? 假設我們有下面的代碼:「返回這個」在javascript函數中做什麼?

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

是什麼「返回此」做一個函數內?

我知道上面的代碼是什麼,以及「this」關鍵字的用法是什麼。我只是不知道「返回這個」在函數內部做了什麼。

+1

@ user722756:如果你想鏈指令,像這樣這可能是有用的,因爲'method'被添加到'Function.prototype','this'將引用一個針對其調用「方法」的函數。這個函數大概是用來作爲「構造函數」的,因爲'method'擴展了函數的'prototype'對象。 – RightSaidFred

+1

我知道使用「this」這個關鍵字我只是不知道在函數內部使用「return this」是什麼。 – user722756

+7

'return this'用於創建[流暢的界面](http://en.wikipedia.org/wiki/Fluent_interface)。請參閱下面的@marcioAlmada和@AdamRackis發佈的答案。 –

回答

48

它引用當前正在調用該方法的對象實例。它用於鏈接。例如,你可以做這樣的事情:

myObject.foo().bar(); 

由於foo回報this(參考,myObject),bar將在對象上調用了。這與做同樣的事情

myObject.foo(); 
myObject.bar(); 

但需要更少的打字。

下面是一個更完整的例子:

function AnimalSounds() {} 

AnimalSounds.prototype.cow = function() { 
    alert("moo"); 
    return this; 
} 

AnimalSounds.prototype.pig = function() { 
    alert("oink"); 
    return this; 
} 

AnimalSounds.prototype.dog = function() { 
    alert("woof"); 
    return this; 
} 

var sounds = new AnimalSounds(); 

sounds.cow(); 
sounds.pig(); 
sounds.dog(); 

sounds.cow().pig().dog(); 

http://jsfiddle.net/jUfdr/

+0

爲什麼不說明使用實際代碼,因爲擴展'prototype'就是它的作用? 'AnimalSounds.method('cow',func ...).method('pig',func ...).method('dog',func ...);' – RightSaidFred

10

tl; dr從方法返回this是允許將方法「鏈接」在一起的常用方法。


this是指當前背景下,和這取決於你調用一個函數的方式而改變含義。

隨着功能調用,this指全局對象,即使函數被從一個方法調用,並且該函數屬於同一類作爲方法調用它。 Douglas Crockford將此描述爲「語言設計中的錯誤」[Crockford 28]

通過方法調用,this引用調用 方法的對象。

通過應用調用,this指您調用apply時設置的任何值。

隨着構造函數調用,this指的是爲您創建的幕後 的對象,當 構造退出(只要你不misguidedly從構造函數返回自己的對象),其返回。

在你上面的例子,你會創建一個名爲method新方法,它允許你動態地添加功能,並返回this,從而允許鏈接。

所以,你可以這樣做:

Car.method("vroom", function(){ alert("vroom"); }) 
    .method("errrk", function() { alert("errrk"); }); 

等。

11

這意味着該方法將返回它所屬的對象。

MyObject.method1().method2().method3(); 

現實世界的例子:jQuery的

$(this).addClass('myClass').hide(); 
+6

+1這實際上是jQuery的名氣對於。 – BoltClock