2011-01-31 63 views
4

我有一个带有可变数目参数的JS对象。有没有办法查看这个特定时间已经通过了哪些参数?javascript:获取所有对象参数

的例子:

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

获取DIV id为chosenID

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

获得所有inputs与ID chosenID;

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

谢谢!

ps:我非常感谢您帮助我的时间,但请不要在此提供jQuery或其他JS框架,因为这仅用于学习目的。索林非常感谢。

回答

5

使用for … in循环遍历传递的对象的参数,如:

var prop; 

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

不要忘了hasOwnProperty检查的属性。

+0

这应该是`for(var prop in data)`? – 2013-08-28 20:51:03

+0

@SamSelikoff不,``prop`已经用`var`在本地作用域声明。 – 2013-08-30 11:08:51

+0

啊,这两种方式有什么区别吗? – 2013-08-30 20:26:24

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; 
    }; 
} 
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库),我发现它简单且干净,只是为了处理上述方法之一中的输入对象的属性。