だから私は、私は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;
を今、私はobj
上isPlainObject(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: これはisPlainObject
内arguments
配列のようなオブジェクトをログに記録するときに私が得るにconsole.logです。ログを見ると
配列は今二つの引数を有することを示すように思われます。しかし、長さはまだ1
です。あなたはすべてのオブジェクトのプロトタイプにアクセスしている
({}).constructor.prototype
を呼び出すことによって
何(奇妙な)ブラウザを使用していますか? [それは私のために '真実を示す...?](http://jsfiddle.net/mattlunn/bR7PX/) – Matt
私はQUnit test()コールの中でテストしています。そして、あなたは正しい。私はちょうどコンソールでテストを実行し、すべてが期待通りに機能する。 QUnit内でこのテストを実行すると、なぜこのような効果が得られますか?スコープに問題がありますか? – Xaxis
私にとってもそうです。 'typeof obj'と' {} .toString.call(obj) 'はあなたのために何を返しますか? – Barmar