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

Oma*_*mar 133 javascript

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

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}
Run Code Online (Sandbox Code Playgroud)

确实有prop2定义?

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

我尝试了这里建议的内容:如何确定Native JavaScript Object是否具有属性/方法?但我认为它不适用于匿名对象.

Sea*_*ira 252

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想检查动态变量`if(typeof myObj[propoeryStr] === 'function') { ... }` (2认同)

art*_*ung 38

你想要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
	
Run Code Online (Sandbox Code Playgroud)

参考文献:Mozilla,Microsoft,phrogz.net.

  • 如果你在一个自制对象中放置了一个dom节点,这将无法工作,例如`var my_obj = {'node1':document.createElement('div')};`那么`my_obj.node1.hasOwnProperty('cloneNode ')`是假的.但Sean的解决方案将正确返回true:`typeof my_obj.node1.cloneNode ==='function' (4认同)
  • 如果您正在寻找原型中定义的方法,则无法工作. (4认同)
  • @artlung是的,你的回答对这个问题有好处,只是想把这个评论留给其他可能正在寻找类似解决方案的人在其他情况下工作(比如我)......并不意味着取消你的答案. (3认同)
  • @Wilt 问题指定匿名对象文字。 (2认同)
  • 不处理定义了属性但不是函数的情况。 (2认同)

Pet*_*eng 14

3选项

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


Mat*_*all 8

你是什​​么意思"匿名对象?" myObj由于您已将对象文字指定给变量,因此不是匿名的.你可以测试一下:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}
Run Code Online (Sandbox Code Playgroud)