我有一个简单的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;
现在当我在obj
上运行isPlainObject(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
});
编辑:
在isPlainObject
中,当记录arguments
类数组对象时,我得到了以下console.log
。
从日志来看,似乎数组现在有两个参数。但长度仍然是1
。
typeof obj
和{}
.toString.call(obj)` 对你来说返回什么? - Barmartypeof obj
是什么?现在{}.toString.call(obj)
返回什么?) - ruakhObject.prototype
!(它是obj.constructor.prototype
的原型)。然而我不确定这会如何影响你的函数。 - Bergiobject.hasOwnProperty(prop)
(例如types.hasOwnProperty(d)
)或者更好的方式是,永远不要修改Object.prototype!(真的!这就是为什么你不应该这样做!)虽然这可能是另一个“修改了Object.prototype,现在for..in不起作用”的问题的重复,但我建议关闭此问题。 - apsillers