Как проверить, есть ли у анонимного объекта метод?

145

Как я могу проверить, был ли анонимный объект создан таким образом:

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

действительно ли определен prop2?

prop2 всегда будет определяться как функция, но для некоторых объектов это не требуется и не будет определено.

Я попробовал то, что было предложено здесь: Как определить, есть ли у Собственного объекта JavaScript свойство / метод? но я не думаю, что это работает для анонимных объектов.

Омар
источник
6
В JavaScript нет большой разницы между анонимными и неанонимными объектами. Они одинаковые под крышкой.
Вава

Ответы:

279

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
	

Ссылки: Mozilla , Microsoft , phrogz.net .

artlung
источник
4
это не сработает, если вы поместили dom-узел в самодельный объект, например, если var my_obj = {'node1': document.createElement('div')};тогда my_obj.node1.hasOwnProperty('cloneNode')false. однако решение Шона правильно вернет истину:typeof my_obj.node1.cloneNode === 'function'
mulllhausen
6
Не будет работать, если вы ищете метод, который был определен в прототипе.
Уил
2
@ Заданный вопрос задан литералом анонимного объекта.
artlung
4
@artlung Да, ваш ответ хорош для вопроса, просто хотел оставить этот комментарий здесь для тех, кто может искать подобное решение, работающее в других случаях (например, я) ... Не хотел дисквалифицировать ваш ответ.
Уилт
2
Не обрабатывает случай, когда свойство определено, но не является функцией.
matt2000
15

3 варианта

  1. typeof myObj.prop2 === 'function' если имя свойства не динамическое / сгенерированное
  2. myObj.hasOwnProperty('prop2') если имя свойства является динамическим, и проверьте только, является ли оно прямым свойством (не в цепочке прототипов)
  3. 'prop2' in myObj если имя свойства динамическое, проверьте цепочку прототипов
Питер Ценг
источник
8

Что вы подразумеваете под «анонимным объектом»? myObjне является анонимным, так как вы присвоили литерал объекта переменной. Вы можете просто проверить это:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}
Мэтт Болл
источник
1

Один из способов сделать это должен быть if (typeof myObj.prop1 != "undefined") {...}

Айн Тохври
источник
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>
Хавьер Элис
источник