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

Pet*_*rks 6 javascript inheritance prototypal-inheritance

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

function isEmpty(obj) {
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop))
      return false;
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)

但是假设Object原型被添加到如下:

Object.prototype.Foo = "bar";
Run Code Online (Sandbox Code Playgroud)

测试:

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

我试图核对对象的原型,改变它的构造函数,以及各种类型的黑客攻击.什么都没有用,但也许我做错了(很可能).

qwe*_*ymk 3

只需删除obj.hasOwnProperty过滤器:

function isEmpty(obj) {
  for (var prop in obj) {
    return false;
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)

演示版

这样它还会告诉您是否包含任何属性或者原型链中是否有任何内容(如果这是您想要的)。

或者你可以改变

if (obj.hasOwnProperty(prop))
Run Code Online (Sandbox Code Playgroud)

if (!obj.hasOwnProperty(prop))
Run Code Online (Sandbox Code Playgroud)

如果你只想知道是否有什么东西弄乱了它的原型。