【问题标题】:How to check if anonymous object has a method?如何检查匿名对象是否有方法?
【发布时间】:2011-03-01 18:00:54
【问题描述】:

如何检查匿名对象是否是这样创建的:

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

确实定义了 prop2 吗?

prop2 将始终定义为函数,但对于某些对象,它不是必需的,也不会被定义。

我尝试了这里的建议:How to determine if Native JavaScript Object has a Property/Method?,但我认为它不适用于匿名对象。

【问题讨论】:

  • JavaScript 中的匿名对象和非匿名对象没有太大区别。它们在封面下是一样的。

标签: javascript


【解决方案1】:

typeof myObj.prop2 === 'function'; 会让你知道函数是否已定义。

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

【讨论】:

  • 如果你想检查动态变量if(typeof myObj[propoeryStr] === 'function') { ... }试试这个
【解决方案2】:

一种方法必须是if (typeof myObj.prop1 != "undefined") {...}

【讨论】:

    【解决方案3】:

    “匿名对象”是什么意思? myObj 不是匿名的,因为您已将对象文字分配给变量。你可以测试一下:

    if (typeof myObj.prop2 === 'function')
    {
        // do whatever
    }
    

    【讨论】:

      【解决方案4】:

      你想要hasOwnProperty():

      var myObj1 = { 
      	prop1: 'no',
      	prop2: function () { return false; }
      }
      var myObj2 = { 
      	prop1: 'no'
      }
      
      console.log(myObj1.hasOwnProperty('prop2')); // returns true
      console.log(myObj2.hasOwnProperty('prop2')); // returns false
      	

      参考:MozillaMicrosoftphrogz.net

      【讨论】:

      • 如果你在自制对象中放置了一个dom节点,这将不起作用,例如如果var my_obj = {'node1': document.createElement('div')};然后my_obj.node1.hasOwnProperty('cloneNode')是假的。但是肖恩的解决方案将正确返回 true:typeof my_obj.node1.cloneNode === 'function'
      • 如果您正在寻找原型中定义的方法,将无法使用。
      • @Wilt 问题指定匿名对象字面量。
      • @artlung 是的,您的回答对这个问题有好处,只是想在此处为可能正在寻找在其他情况下工作的类似解决方案的其他人(如我)留下该评论......没有意思是取消你的回答。
      • 不处理定义了属性但不是函数的情况。
      【解决方案5】:

      3 个选项

      1. typeof myObj.prop2 === 'function' 如果属性名称不是动态/生成的
      2. myObj.hasOwnProperty('prop2') 如果属性名称是动态的,并且只检查它是否是直接属性(而不是原型链)
      3. 'prop2' in myObj如果属性名是动态的,向下检查原型链

      【讨论】:

        【解决方案6】:

        我知道这是一个老问题,但我很惊讶所有答案都确保该方法存在 并且它是一个函数,而 OP 只想检查是否存在。要知道它是一个函数(正如许多人所说),您可以使用:

        typeof myObj.prop2 === 'function'
        

        但你也可以用作条件:

        typeof myObj.prop2
        

        甚至:

        myObj.prop2
        

        之所以如此,是因为函数的计算结果为true,而undefined 的计算结果为false。所以如果你知道如果成员存在它可能只是一个函数,你可以使用:

        if(myObj.prop2) {
          <we have prop2>
        }
        

        或者在一个表达式中:

        myObj.prop2 ? <exists computation> : <no prop2 computation>
        

        【讨论】:

          【解决方案7】:

          最好使用Object.prototype.hasOwnProperty.call(obj, method)

          在 ECMAScript 5.1 中,添加了 Object.create,它可以创建具有指定 [[Prototype]] 的对象。 Object.create(null) 是一种常见的模式,用于创建将用作 Map 的对象。当假定对象将具有来自 Object.prototype 的属性时,这可能会导致错误。此规则防止直接从对象调用某些 Object.prototype 方法。

          此外,对象的属性可能会影响 Object.prototype 上的内置函数,这可能会导致意外行为或拒绝服务安全漏洞。例如,Web 服务器解析来自客户端的 JSON 输入并直接在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户端可以发送像 {"hasOwnProperty": 1} 这样的 JSON 值并导致服务器崩溃。

          为避免此类细微错误,最好始终从 Object.prototype 调用这些方法。例如,foo.hasOwnProperty("bar") 应该替换为 Object.prototype.hasOwnProperty.call(foo, "bar")。

          const myObj = { 
            prop1: 'no',
            prop2: function () { return false }
          }
          
          console.log(Object.prototype.hasOwnProperty.call(myObj, 'prop2'))
          console.log(Object.prototype.hasOwnProperty.call(myObj, 'prop3'))

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-02
            • 1970-01-01
            • 2012-06-01
            • 1970-01-01
            • 2011-07-04
            相关资源
            最近更新 更多