所以我有一个简单的isPlainObject
方法用于测试JavaScript对象文字:
var isPlainObject = function (obj) {
return typeof obj === "object" && {}.toString.call(obj) === "[object Object]";
};
现在我有一个普通的对象:
var obj = {'one': 1, 'two': 2, 'three': 3};
当我通过isPlainObject(obj)
函数运行它时,它按预期工作并返回true
。我的问题来自于向对象的原型添加属性:
obj.constructor.prototype.four = 4;
现在当我在isPlainObject(obj)
上运行obj
时,它会返回false
。 typeof obj
在两个实例中都返回object
。在我向原型添加属性后,toString
在第二个实例中返回[object Number]
。
改变obj
到底发生了什么?发生了什么事?
编辑: 只有在 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
});
编辑:
这是我在arguments
内记录isPlainObject
类似数组的对象时得到的console.log。
查看日志似乎表明该数组现在有两个参数。但是长度仍然是1
。
答案 0 :(得分:1)
致电
({}).constructor.prototype
您正在访问所有对象的原型。所以基本上你是为每个本地对象添加一个“四”属性。
如果你想扩展你的对象实例,理想情况下你需要一个新的构造函数,比如:
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