Як перевірити, чи має анонімний об’єкт метод?


145

Як я можу перевірити, чи анонімний об’єкт, який створено як такий:

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

дійсно визначено prop2?

prop2 завжди визначатиметься як функція, але для деяких об'єктів вона не потрібна і не буде визначена.

Я спробував те, що тут було запропоновано: Як визначити, чи має Native JavaScript Object властивість / метод? але я не думаю, що це працює для анонімних об'єктів.


6
Немає великої різниці між анонімними та неанонімними об'єктами в JavaScript. Вони однакові під прикриттям.
vava

Відповіді:


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
	

Список літератури: Mozilla , Microsoft , phrogz.net .


4
це не спрацює, якщо ви розмістили вузол купола в саморобному об’єкті, наприклад, якщо var my_obj = {'node1': document.createElement('div')};тоді my_obj.node1.hasOwnProperty('cloneNode')це значення false. однак рішення Шона правильно поверне справжнє:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
Не буде працювати, якщо ви шукаєте метод, визначений у прототипі.
Звільнений

2
@Wilt питання вказав анонімний об'єкт буквальний.
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
}


0

Я знаю, що це старе питання, але я здивований, що всі відповіді забезпечують існування методу і це функція, коли ОП хоче лише перевірити наявність. Щоб знати, що це функція (як багато хто заявила), ви можете використовувати:

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.