如果Object.prototype被修改,如何测试对象是否为“isEmpty()”?

时间:2012-01-03 05:22:39

标签: javascript inheritance prototypal-inheritance

我想测试对象是否为空:{}。通常使用以下内容:

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 个答案:

答案 0 :(得分:3)

只需删除obj.hasOwnProperty过滤器:

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

DEMO

这样它也会告诉你是否包含任何属性或原型链中是否有任何属性,如果这是你想要的。

或者你可以改变

if (obj.hasOwnProperty(prop))

if (!obj.hasOwnProperty(prop))

如果您只是想知道某些东西是否正在弄乱它的原型。