2012-01-03 6 views
6

オブジェクトが空であるかどうかテストしたい:{}。以下は、一般的に使用されます。Object.prototypeが変更された場合、オブジェクト "isEmpty()"が存在するかどうかをテストする方法?

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

しかし、次のようにObjectプロトタイプが追加されたとします、

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

私は、オブジェクトのプロトタイプをハァハァしようとしたのです、それを変更します。

Object.prototype.Foo = "bar"; 

テストをコンストラクタ、そのようなハッキングのすべての方法。何も働かなかったが、おそらく私はそれを間違っていた(おそらく)。

+0

実際、私はこの質問が間違ったフレーズであることに気付きました。おそらくそうでなければなりません。_「プロトタイプチェーンが変更されたかどうかをテストする方法」_ –

+0

...私が考えることができる唯一の方法は、 "Object"、 "Number"、 "Array"などのすべてのプロパティをハードコードし、既知のプロパティの外側に何もないことを確認することです。かなり厄介です。私は単体テストでこれをやりたいと思っていますが、私はいつも疑問に思っていたプリミティブ型に何かを忍ばせないようにしています(私のコードを下流に吹き飛ばす可能性があり、問題を追跡するのに苦労するでしょう) 。 –

+0

これを読んでください:http://www.3site.eu/doc/ – diEcho

答えて

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

それは...シンプルで明白かもしれませんか?なぜ私のバージョンの機能が最も一般的に使用されているものなのか(このサイトでは数十の答えでお勧めします)、私は不思議です。これは実際には機能しますが、テストにプラグインして、何かが予期せず爆発するかどうかを確認します。 –

+0

@PeterMarks:一般に 'hasOwnProperty'は継承されたプロパティを無視するために使われますが、継承された小道具に興味があるので、フィルタは逆効果です。 – qwertymk

+0

FWIW、JSlintは '' hasOwnProperty''チェックを削除するときに不平を言います。なぜか分かりません。私には分からないことがこれ以上あります。 –

関連する問題