Свойства объектов JavaScript - PullRequest
2 голосов
/ 03 мая 2010

В моем JavaScript я использую объект в качестве ассоциативного массива. Это всегда имеет свойство «главное», и может иметь других. Итак, когда я создаю его, я могу сделать это:

var myobject     = new Object ();
myobject["main"] = somevalue;

Другие свойства могут быть добавлены позже. Теперь, в какой-то момент мне нужно знать имеет ли myobject только одно свойство или несколько, и принимает различные действия в зависимости (я имею в виду только свойства, которые я создал).

Пока все, что я нашел, это что-то вроде:

flag = false;

for (i in myobject)
     {
     if  (i=="main")  continue;
     flag = true;
     break;
     }

и затем ветвь на флаге. Или:

for (i in myobject)
     {
     if  (i=="main")  continue;
     do_some_actions ();
     break;
     }

Эти подходы работают, но мне кажется, что я что-то упустил. Является есть лучший подход?

Ответы [ 4 ]

3 голосов
/ 03 мая 2010

Я бы, наверное, сделал это так

function hasAsOnlyProperty( obj, prop )
{
  for ( var p in obj )
  {
    if ( obj.hasOwnProperty( p ) && p != prop )
    {
      return false;
    }
  }
  return true;
}

var myobject= new Object();
myobject.main = 'test';

// console requires Firebug
console.log( hasAsOnlyProperty( myobject, 'main' ) ); // true

// set another property to force false    
myobject.other = 'test';

console.log( hasAsOnlyProperty( myobject, 'main' ) ); // false
2 голосов
/ 03 мая 2010

Оператор "in":

if ('name' in obj) { /* ... */ }

Существует также функция hasOwnProperty, унаследованная от прототипа Object, которая сообщит вам, имеет ли объект свойство напрямую, а не через наследование прототипа:

if (obj.hasOwnProperty('name')) { /* ... */ }
1 голос
/ 03 мая 2010

Вы можете использовать hasOwnProperty, чтобы проверить, имеет ли объект это свойство.

if (myobject.hasOwnProperty("main")) {
    //do something
}
0 голосов
/ 03 мая 2010

Если вам довелось узнать имя «следующего» метода, назначенного объекту, вы можете проверить как

if (myObject.testMethod) {
    //proceed for case where has > 1 method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...