2009-09-16 29 views
3

我想编写一个小型的JavaScript(框架),可以链接功能与所有以下功能知道其前任的数据。什么是最简单的方式来实现像jQuery这样的可链接的JavaScript框架?

基本上,我对jQuery提供的膨胀(我意识到它很小,对于我的更小的项目虽然膨胀)并不感兴趣,但是想要模仿它的一些行为 - 主要用于学习目的和数据可用于所有链接功能。

我很乐意,例如能够做这样的事情:

myJsLib.processForm("user", "pass").url("http://domain.dev/form.php").queryString({ secure: true, errorPage: "login_failure.htm" }); 

在上面的例子中的所有功能,必须意识到在一定程度上什么其他正在做。

,或者更具体:

myJsLib.getDataIntoArray(jsonObjectOrWhatever).each(function(item) { alert(item); }); 

其中, “项目” 将是数组getDataIntoArray()创建(返回?)。

我希望我有这个适当的措辞。我试图让这个例子太过分了。理解jQuery的原型扩展已被证明是无用的,但我并不熟悉JavaScript。我非常感谢一个详细的(但愚蠢的)解释和代码示例,请。

非常感谢。

编辑:感谢安德鲁我能够拿出一些似乎令人满意的东西。请纠正我似乎有任何误解,谢谢。

function myLib() 
{ 
this.properties = ['status', 'window', 'ui'], 
this.inputArrayParms = function(parms) 
{ 
    for (var i = 0, len = parms.length; i < len; i++) 
    { 
     this.properties[this.properties.length] = parms[i]; 
    } 
    return this; 
}, 
this.each = function(callback) 
{ 
    for (var i = 0, len = this.properties.length; i < len; i++) 
    { 
     callback(this.properties[i]); 
    } 
    return this; 
} 
} 

var f = new myLib; 
f.inputArrayParms(["one", "two", "three"]).each(function(theMsg){ alert(theMsg); }); 

这似乎按预期工作。任何警告?

+0

@Brainsick:不需要在标题中添加“已解决”。另外,如果安德鲁的答案帮助你解决了你的问题,作为礼貌,你应该点击旁边的复选标记标记他的答案为可接受的。 – 2009-09-16 04:41:19

+0

Gotcha。非常抱歉! – Brainsick 2009-09-16 05:23:39

+0

您可以用下面的代码替换执行this.properties [this.properties.length] = parms [i]的for循环:Array.prototype.push.apply(this.properties,parms); – 2009-09-16 05:27:15

回答

5

这叫做fluent interface,创建它的最好方法是让每个函数返回的单个主对象(如jQuery对象)允许将其他函数调用链接在一起。

这里是一个小例子:

function foo() { 
    this.first = function(first) { 
     alert(first); 
     return this; 
    } 
    this.second = function(second) { 
     alert(second); 
     return this; 
    } 
} 

本通知的foo类有两个方法,firstsecond。由于这两种方法返回this它们可以以任意顺序进行链接,你希望:

new foo().first("hello").second("world"); 
new foo().second("hello").first("world"); 
new foo().first("hello").first("world"); 

你的想法:)

去想流畅接口的一个好方法是,他们更容易流动和,可以说是更容易阅读。上面的例子仅仅是对于更习惯用法的替代品:

f = new foo(); 
f.first("hello"); 
f.second("world"); 

这意味着,一个流畅的接口并没有规定任何类的实现超出强制你返回this,这样的方法调用可以链接。这意味着你可以添加字段到这个类中,可以在任何函数中使用,就像任何其他类一样。

+0

谢谢,安德鲁。我会尝试这种方法,但非常感谢代码中的一个小例子。 – Brainsick 2009-09-16 03:54:39

+0

这是太棒了,容易理解。谢谢。我怎么会,例如,我会第二()使用“第一”或在first()中声明或处理的数组? – Brainsick 2009-09-16 04:15:11

+0

如果我理解正确,我们基本上模仿真实的类,因为每个“方法”将简单地指向原始对象的“属性”。感谢您的协助,并随时纠正我的缺点。 – Brainsick 2009-09-16 04:32:24

相关问题