2011-11-28 31 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