JavaScript: 获取所有对象参数

5

我有一个带有可变数量参数的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"});

获取具有id为chosenID的div中的所有inputs

我想知道我传递了一个还是两个参数,以及它们是哪些。

谢谢!

附言:感谢您花时间帮助我,但请不要建议使用jQuery或其他JS框架,因为这仅用于学习目的。非常感谢,Sorin。

3个回答

6

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

var prop;

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

不要忘记使用hasOwnProperty方法检查属性。


这里应该写成for (var prop in data)吗? - Sam Selikoff
1
@SamSelikoff 不,prop已经使用var声明为局部作用域。 - Marcel Korpel
啊,这两种方法有区别吗? - Sam Selikoff
@SamSelikoff 不,for (var prop in data)var prop; for (prop in data)的简写形式。 - Marcel Korpel
抱歉打扰了,但是 for(prop in data) 不是默认认为每个 prop 都存在于 data 中吗?为什么要进行检查? - Sean Kendle
1
@SeanKendle 用于检查属性是否由data拥有或继承。来自MDN:“此方法可用于确定对象是否具有该对象的直接属性作为指定属性;与in运算符不同,此方法不会沿着对象的原型链向下检查。” - Marcel Korpel

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({})
  ...
}

这也为接下来的内容设置了背景。

我的常规处理方式是只检查真值(truth-y value)。真值意味着“已提供”。然而,这种方法的缺点是不将0或''视为“已提供”。

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

如果0是一个被接受的输入,那么我会扩大检查范围,以便将非“undefined”值视为“已提供”。未设置的属性始终默认为“undefined”。(此方法将接受所有真值和假值,例如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 库),我发现在上述方法之一中仅处理输入对象的属性是简单和清晰的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接