2012-01-03 83 views
6

我想测试一个对象是否为空:{}。下面是通常用于:如何在Object.prototype被修改的情况下测试对象“isEmpty()”?

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?!** 

我试图核武器攻击对象的原型,改变它的构造函数,以及所有这些黑客行为。没有任何工作,但也许我做错了(可能)。

+0

其实我刚刚意识到这个问题可能是错误的措词,它应该是:_“如何测试一个原型链是否改变了_”? – 2012-01-03 05:25:00

+0

...我唯一能想到的方式就是硬编码“对象”,“数字”,“数组”等所有属性,并检查已知属性之外没有任何内容。相当混乱。虽然我想在单元测试中做到这一点,但看到没有人将某些东西塞进原始类型中,这一直是我一直怀疑的(因为它可能会炸毁我的代码,并且很难追查这个问题) 。 – 2012-01-03 05:33:28

+0

阅读此:http://www.3site.eu/doc/ – diEcho 2012-01-03 06:02:05

回答

3

只需卸下obj.hasOwnProperty过滤器:

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

DEMO

这样,它还会告诉你,如果包含任何属性或者如果有的话是在原型链,如果这就是你想要的。

或者你可以改变

if (obj.hasOwnProperty(prop)) 

if (!obj.hasOwnProperty(prop)) 

,如果你只是想知道如果事情是与它的原型搞乱。

+0

难道是...很简单明显吗?我想知道为什么我的函数版本是最常用的版本(并在这个网站的几十个答案中推荐)。这确实有效,但我想将其插入到我的测试中,以查看是否有任何意外的事情发生。 – 2012-01-03 06:04:04

+0

@PeterMarks:通常'hasOwnProperty'用于忽略继承的属性,但由于您对继承的道具感兴趣,因此过滤器会适得其反。 – qwertymk 2012-01-03 06:09:27

+0

FWIW,JSlint在删除hasOwnProperty检查时抱怨。不确定为什么。还有一件事我没有得到。 – 2012-01-03 06:12:27

相关问题