如何检查匿名对象是否有方法?

时间:2010-06-09 15:45:59

标签: javascript

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

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

确实定义了prop2吗?

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

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

7 个答案:

答案 0 :(得分:241)

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

答案 1 :(得分:35)

您想要hasOwnProperty()

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

alert(myObj1.hasOwnProperty('prop2')); // returns true
alert(myObj2.hasOwnProperty('prop2')); // returns false

参考文献:MozillaMicrosoftphrogz.net

答案 2 :(得分:12)

3个选项

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

答案 3 :(得分:8)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

<块引用>

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

<块引用>

此外,对象可能具有隐藏 Object.prototype 上的内置函数的属性,这可能会导致意外行为或拒绝服务安全漏洞。例如,网络服务器解析来自客户端的 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'))

答案 6 :(得分:0)

我知道这是一个老问题,但是令我惊讶的是,当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>