2013-05-01 8 views
7

だから私は、私はJavaScriptのオブジェクトリテラルをテストするために使用し、簡単なisPlainObject方法があります:私はそれが動作isPlainObject(obj)機能を通してそれを実行するとオブジェクトリテラルのプロトタイプにプロパティを追加すると、その "タイプ"が変更されるのはなぜですか?

var obj = {'one': 1, 'two': 2, 'three': 3}; 

:今、私はプレーンなオブジェクトを持っている

var isPlainObject = function (obj) { 
    return typeof obj === "object" && {}.toString.call(obj) === "[object Object]"; 
}; 

を期待どおりにtrueを返します。私の質問は、オブジェクトのプロトタイプにプロパティを追加することから到着:

obj.constructor.prototype.four = 4; 

を今、私はobjisPlainObject(obj)を実行すると、それはfalseを返します。 typeof objは、どちらの場合もobjectを返します。 toStringは、プロトタイプにプロパティを追加した後に2番目のインスタンスに[object Number]を返します。

objを正確に変更しましたか?どうしたの?

EDIT:QUnit関数呼び出しの範囲内で試験したとき にのみ発生します。

test("each", function() { 

    _.each([1, 2, 3], function(i,v) { 
     equal(v, i + 1, 'each iterator provided index and value from array'); 
    }); 

    var obj = {'one': 1, 'two': 2, 'three': 3}; 
    console.log(_.isPlainObject(obj)); // => true 
    obj.constructor.prototype.four = 4; 
    console.log(_.isPlainObject(obj)); // => false 

}); 

EDIT: これはisPlainObjectarguments配列のようなオブジェクトをログに記録するときに私が得るにconsole.logです。ログを見ると

Logging out the <code>arguments</code> object

配列は今二つの引数を有することを示すように思われます。しかし、長さはまだ1です。あなたはすべてのオブジェクトのプロトタイプにアクセスしている

({}).constructor.prototype 

を呼び出すことによって

+9

何(奇妙な)ブラウザを使用していますか? [それは私のために '真実を示す...?](http://jsfiddle.net/mattlunn/bR7PX/) – Matt

+0

私はQUnit test()コールの中でテストしています。そして、あなたは正しい。私はちょうどコンソールでテストを実行し、すべてが期待通りに機能する。 QUnit内でこのテストを実行すると、なぜこのような効果が得られますか?スコープに問題がありますか? – Xaxis

+4

私にとってもそうです。 'typeof obj'と' {} .toString.call(obj) 'はあなたのために何を返しますか? – Barmar

答えて

1

。だから本質的に、すべてのネイティブオブジェクトに「4」のプロパティを追加していました。

あなたがオブジェクトインスタンスを延長したい場合は、理想的には同じように、新しいコンストラクタ関数が必要になります

var Count = function() { 
    this.one = 1; 
    this.two = 2; 
    this.three = 3; 
} 

var obj = new Count(); 
obj.four = 4; 

またはコンストラクタ関数を拡張する:

Count.prototype.four = 4; 

かかわらず...わからないがこれはQUnitを破るが、別のポスターはhasOwnPropertyがそのトリックを行うべきだと示唆している。ここをクリックsimilar question

関連する問題