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

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

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

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

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

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

Ответ 1

typeof myObj.prop2 === 'function'; сообщит вам, определена ли функция.

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

Ответ 2

Вы хотите 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
	

Ответ 3

3 Опции

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

Ответ 4

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

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

Ответ 5

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

Ответ 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>