2011-04-12 145 views
1

我已经看到语法:扩展功能

var module = { 

    func: function(value) { 

     some code; 

    }.func2("value"); 

} 

在不同的地方突然出现,因为我想知道如何做到这一点。我记得以前看过一篇关于它的文章,但现在找不到它。无论我尝试.func2("value")只是语法错误。

例如,看看SproutCore的介绍他们的TemplateView。

Todos.StatsView = SC.TemplateView.extend({ 
    remainingBinding: 'Todos.todoListController.remaining', 

    displayRemaining: function() { 
    var remaining = this.get('remaining'); 
    return remaining + (remaining === 1 ? " item" : " items"); 
    }.property('remaining').cacheable() 
}); 

似乎它是一个在编写工厂时给用户的有用工具。

谢谢。

+0

这看起来与http://jquery.com/的工作方式高度一致。您可能看到了使用库的应用程序。 – Khez 2011-04-12 05:57:35

+0

我也在SproutCore中看到过它。似乎它对工厂很有用。 – nicholas 2011-04-12 06:04:11

+0

真棒!我今天真的学到了一些东西。 – 2011-04-12 09:15:29

回答

1

您可以添加属性函数的原型,然后链功能定义。例如:

Function.prototype.trigger = function(trigger) { 

    var setValue = this; 

    return function(thevalue) { 
     alert(trigger + ' set to ' + thevalue); 
     setValue(thevalue); 
    }; 

}; 

var _value = 0; 

var setValue = function(thevalue) { 

    _value = thevalue; 

}.trigger('value'); 

setValue(25); 

当setValue方法定义的触发函数它拴在匿名功能的范围内被调用,并且setValue方法被分配由触发器返回的值。在这种情况下,我们只是警告setValue被调用,但是这会打开一些非常酷的可能性。

很漂亮。

0

我认为你正在寻找它的语法是:

func: (function(value) { 
    //some code; 
}("value")); 

在该匿名函数立即调用和返回值分配给func

参见:How do JavaScript closures work?

+0

不,我知道关闭。检查编辑。 SproutCore使用它来允许用户标记缓存,数据绑定等功能...... – nicholas 2011-04-12 06:10:01

0

这kind'a weird.Maby是是这样的:

var module = { 
    func : (function(){ 
     return {func2 : function(v){alert(v);}}; 
    }).func2('alert me'); 
} 

你不能链函数定义(function func(){}.func1()),只有函数调用(如果配置正确),那会看起来像:func1().func2().func3().....

+0

啊,但你可以看起来像。我只是不明白。例如:http://guides.sproutcore.com/html_based.html#defining-your-model。我假设他们正在通过某种预处理器循环代码,但我现在已经在几个地方看到了这一点。 – nicholas 2011-04-12 06:12:15

+0

在纯JavaScript中,会触发错误。如果你想为你自己的语言使用一个解释器,然后将它翻译成JavaScript,几乎任何事情都是可能的。请看看processing是如何工作的。它使用处理(主要是C)语言与所有经典的声明类型:int a;','char b;','void main(){}',它在纯js中会触发错误,但是它首先被解释然后翻译成JavaScript,所以一切工作正常。虽然这是可能的,但它只是为了一个光滑的合成器而经历的一切。 – 2011-04-12 06:29:10

+0

我同意。我刚才在这么多地方看过这个语法,我认为它有一些技巧。扩展函数的原型,或函数的构造函数的原型... – nicholas 2011-04-12 06:35:02