我确定此问题之前已经得到解答,但我认为我没有使用正确的搜索词组。
我认为一个例子可以更好地解释我想要问的问题:
var test = {};
test.example = function(parameter_2){
alert(parameter_1+parameter_2);
}
test("parameter_1").example("parameter_2");
显然最后一行不起作用。基本上想要做一些像jQuery这样的东西选择器,但只是更古老。
我可能只是将两个参数都传递给示例(p1,p2)函数。
这有点激起了我的好奇心。
我发现了这个:http://enterprisejquery.com/2010/08/javascript-parameter-patterns-with-extend-and-beyond/但我认为它没有完全回答我的问题。
答案 0 :(得分:4)
为什么我们不使用原型继承创建无限可链接性,并创建使用自动创建的 arguments
array 传递尽可能多的参数的可能性?
我将介绍简化版。您还可以为所有这些创建一个漂亮的包装器,并将包装器返回到世界......窗口 like on this page 。
请注意,您必须将{strong> new
关键字与test
一起使用...否则全部 the this
keywords will end up referring simply to the window
.. ........这不是那么有用。
因此,此对象的每个实例执行两项操作:
您可以根据需要链接所有方法。这是通过使用return this;
它会跟踪this.args
传递的所有参数。
示例:强>
new test("p1", "p2").example("p3").example("p4", "p5").showAll("p6", "p7", "p8");
// Output:
// The params are: p1, p2, p3, p4, p5, p6, p7, p8
守则:
(function(){ // <== Let's not pollute the global namespace.
function test() { // <== The constructor
// Must copy arguments, since they're read only
this.args = [];
this.addArgs(arguments);
}
// Add some methods:
test.prototype = {
example : function() {
// Add on new arguments
this.addArgs(arguments);
// Return the instance for chainability
return this;
},
showAll : function() {
var i, string = "The params are: ";
// Add on new arguments
this.addArgs(arguments);
// show all arguments
alert(string + this.args.join(", "));
return this;
},
addArgs: function(array) {
var i;
for (i = 0; i < array.length; ++i)
{ this.args.push(array[i]); }
return this;
}
};
new test("p1","p2").example("p3").example("p4","p5").showAll("p6","p7","p8");
})();
这种方法可能不像第一次那样有用,但更好地利用了JS的无类特性。它可以调整为在某些情况下非常有用。诀窍在于,在对象的属性中,this
指的是对象。在这种情况下,您不必使用new
关键字,但仍然可以获得可链接性,但格式会略有不同....您基本上直接引用T
。
无论如何,它只是使用return this;
:
(function(){ // <== Let's not pollute the global namespace.
var T = {}; // "this" will be T in the properties / methods of T
T.args = [];
T.example = function() {
var i;
for (i = 0; i < arguments.length; ++i)
{ this.args.push(arguments[i]); }
return this; // <== Chainability
};
T.show = function() {
alert(this.args.join(","));
return this;
}
// Let's try it out:
T.example("a", "b").example("c").show();
// Output: a, b, c
})();
<强> jsFiddle example 强>
答案 1 :(得分:3)
编辑这不是一个很好的例子,因为这会污染全局对象。使用Rontologist的例子。
嗯试试这个
var test = function(parameter_1){
this.example = function(parameter_2){
alert(parameter_1+parameter_2);
}
return this;
};
test("parameter_1").example("parameter_2");
答案 2 :(得分:2)
一种非全球性的方式来做RueTheWhirled之前所说的:
function test(p1) {
var obj = new Object();
obj.example = function(p2) {
alert(p1 + p2);
}
return obj;
}
test(1).example(2);
它的基本思想相同,但它改变了一个本地对象。
上面发布了一条评论,要求提供关于此的链接(我没有不幸)但在此设置上运行以下代码段会产生预期的4和6。
var a = test2(1);
var b = test2(2);
a.example(3);
b.example(4);