Как проверить, является ли объект "isEmpty ()", если Object.prototype был изменен? - PullRequest
6 голосов
/ 03 января 2012

Я хочу проверить, является ли объект пустым: {}. Обычно используется следующее:

function isEmpty(obj) {
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop))
      return false;
  }
  return true;
}

Но предположим, что прототип Object был добавлен следующим образом:

Object.prototype.Foo = "bar";

Тесты:

alert(isEmpty({}));              // true
Object.prototype.Foo = "bar";
alert({}.Foo);                   // "bar" oh no...
alert(isEmpty({}));              // true  ...**huh?!**

Я пытался уничтожить прототип объекта, изменить его конструктор и все подобные способы взлома. Ничего не помогло, но, возможно, я сделал это неправильно (вероятно).

1 Ответ

3 голосов
/ 03 января 2012

Просто удалите фильтр obj.hasOwnProperty:

function isEmpty(obj) {
  for (var prop in obj) {
    return false;
  }
  return true;
}

DEMO

Таким образом, он также скажет вам, содержит ли какие-либо свойства или что-то находится вцепочка прототипов, если это то, что вы хотите.

В качестве альтернативы вы можете изменить

if (obj.hasOwnProperty(prop))

на

if (!obj.hasOwnProperty(prop))

, если хотите знать только, что с ним что-то не так.прототип.

...