【问题标题】:javascript: get all object parametersjavascript:获取所有对象参数
【发布时间】:2011-06-18 21:19:42
【问题描述】:

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

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

谢谢!

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

【问题讨论】:

    标签: javascript object parameters parameter-passing


    【解决方案1】:

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

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

    别忘了用hasOwnProperty查看房产。

    【讨论】:

    • 应该是for (var prop in data)吗?
    • @SamSelikoff 不,prop 已使用 var 在本地范围内声明。
    • 啊,这两种方式有区别吗?
    • @SamSelikoff 不,for (var prop in data) 是 var prop; for (prop in data) 的简写。
    • @SeanKendle 检查一个属性是由data 拥有还是被继承。来自MDN:“该方法可用于判断一个对象是否具有指定属性作为该对象的直接属性;与in 运算符不同,此方法不会检查对象的原型链。”
    【解决方案2】:

    使用对象迭代 (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;
        };
    }
    

    【讨论】:

      【解决方案3】:

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

      因此,我将介绍一些具体情况。 首先,我通常从以下内容开始:

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

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

      我的常规方法只是检查一个真值。真值意味着“提供”。但是,这样做的缺点是不将 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 库),我发现仅在上述方法之一中处理输入对象上的属性是简单而干净的。

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多