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


145

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

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

确实定义了prop2吗?

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

我尝试了以下建议:如何确定本机JavaScript对象是否具有属性/方法?但我认为它不适用于匿名对象。


6
JavaScript中的匿名和非匿名对象之间没有太大区别。它们在封面下是相同的。
vava 2010年

Answers:


278

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
如果要检查动态变量,请尝试此操作if(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

您要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


4
如果您将dom节点放置在自制对象中(例如,如果var my_obj = {'node1': document.createElement('div')};then my_obj.node1.hasOwnProperty('cloneNode')为false),则此方法将无效。但是Sean的解决方案将正确返回true:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
如果您正在寻找原型中定义的方法,将无法使用。
Wilt

2
@Wilt问题指定了匿名对象文字。
artlung

4
@artlung是的,您的答案对这个问题有帮助,只是想在其他人(例如我)正在寻找类似解决方案的其他人(例如我)上留下此评论……并非要取消您的答案的资格。
威尔特

2
不处理定义了属性但不是函数的情况。
matt2000 '18

15

3种选择

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

8

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

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


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.