javascript:获取所有对象参数

时间:2011-01-31 21:34:18

标签: javascript object parameters parameter-passing

我有一个带有可变数量参数的JS对象。有没有办法看到在特定时间传递了哪些参数?

示例:

function getElement() {
    var scope = document;

    this.by = function(data){
        if (data.id)    scope = scope.getElementById(data.id);
        if (data.tag)   scope = scope.getElementsByTagName(data.tag);       
        return scope;
    }
}

我这样运行

var x = new getElement(); 
vad div = x.by({id : "chosenID"});

获取ID为chosenID

的div

var x = new getElement(); 
vad inputs = x.by({id : "chosenID", tag : "input"});

获取div中inputs的所有chosenID;

我想知道我是否传递了一个或两个参数,以及哪些参数。

谢谢!

ps:感谢您抽出时间帮助我,但请不要吝啬jQuery或其他JS框架,因为这仅用于学习目的。很多,索林。

3 个答案:

答案 0 :(得分:5)

使用for … in循环迭代传递的对象的参数,例如:

var prop;

for (prop in data) {
    if (data.hasOwnProperty(prop)) {
        // do something with data[prop]
    }
}

不要忘记使用hasOwnProperty检查酒店。

答案 1 :(得分:1)

使用对象迭代(key in data)和数组合...你可以返回许多元素......尽管switch语句使对象迭代变得无用。

function getElement() {
    var scope = document;
    this.by = function(data){
        var key;
        var ret=[];
        for (key in data) {
          if(data.hasOwnProperty(key)) {
            switch(key) {
              case "id":
                ret=ret.concat(scope.getElementById(data[key]));
                break;
              case "tag":
                ret=ret.concat(scope.getElementsByTagName(data[key]));
                break;
              default:
                throw new Error("Unknown property "+key);
            }
          }
        }
        return ret;
    };
}

答案 2 :(得分:1)

有很多好的一般答案,但请考虑一下:

相反,我将介绍一些具体案例。 首先,我通常从:

开始
function f (x) {
  x = x || {} // so f() will be accepted as per f({})
  ...
}

这也为以下内容设置了上下文。

我的正常方法是检查真值y值。真值表示“提供”。然而,这具有不将0或''视为“提供”的缺点。

if (x.id) {
   // x.id is any truth-y
}

如果0是接受的输入,那么我加宽了检查,以便将非undefined值视为“提供”。未设置的属性始终默认为undefined。 (此方法将接受所有真值y和false-y值,例如0,“”和null)。

if (x.id !== undefined) {
   // x.id is all truth-y and all-but-undefined false-y
}

如果undefined是可接受的输入(我强烈反对),则检查可以基于hasOwnProperty。这样做的好处是不会检查[[prototype]]链。

if (x.hasOwnProperty("id")) {
   // x.id set to something, including undefined
}

for(..in..)构造也可用于迭代对象中的属性(包括[[prototype]]中的属性,除非它们被特别隐藏)。但是,对于处理输入的一般情况(例如,不创建JSON库),我发现它只是简单而干净,只是为了在上述方法之一中处理输入对象的属性。