Javascript:将参数传递给对象和函数..?

时间:2010-09-21 20:15:03

标签: javascript jquery

我确定此问题之前已经得到解答,但我认为我没有使用正确的搜索词组。

我认为一个例子可以更好地解释我想要问的问题:

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/但我认为它没有完全回答我的问题。

3 个答案:

答案 0 :(得分:4)

方法1:

为什么我们不使用原型继承创建无限可链接性,并创建使用自动创建的 arguments array 传递尽可能多的参数的可能性?

我将介绍简化版。您还可以为所有这些创建一个漂亮的包装器,并将包装器返回到世界......窗口 like on this page

请注意,您必须将{strong> new 关键字与test一起使用...否则全部 the this keywords will end up referring simply to the window .. ........这不是那么有用。


因此,此对象的每个实例执行两项操作:

  1. 您可以根据需要链接所有方法。这是通过使用return this;

  2. 实现的
  3. 它会跟踪this.args传递的所有参数。


  4. 示例:

    jsFiddle

    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");
    })();​
    

    方法2:

    这种方法可能不像第一次那样有用,但更好地利用了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);