所以我有一个简单的isPlainObject方法用于测试JavaScript对象文字:
var isPlainObject = function (obj) {
return typeof obj === "object" && {}.toString.call(obj) === "[object Object]";
};
Run Code Online (Sandbox Code Playgroud)
现在我有一个普通的对象:
var obj = {'one': 1, 'two': 2, 'three': 3};
Run Code Online (Sandbox Code Playgroud)
当我通过该isPlainObject(obj)函数运行它时,它按预期工作并返回true.我的问题来自于向对象的原型添加属性:
obj.constructor.prototype.four = 4;
Run Code Online (Sandbox Code Playgroud)
现在,当我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
});
Run Code Online (Sandbox Code Playgroud)
编辑:这是我在记录arguments类似数组的对象时得到的console.log isPlainObject.
小智 1
通过致电
({}).constructor.prototype
Run Code Online (Sandbox Code Playgroud)
您正在访问所有对象的原型。所以本质上你是在给每个原生对象添加一个“4”属性。
如果您想扩展对象实例,理想情况下您需要一个新的构造函数,例如:
var Count = function() {
this.one = 1;
this.two = 2;
this.three = 3;
}
var obj = new Count();
obj.four = 4;
Run Code Online (Sandbox Code Playgroud)
或者扩展构造函数:
Count.prototype.four = 4;
Run Code Online (Sandbox Code Playgroud)
不管怎样......不确定这会破坏 QUnit,但正如另一张海报所建议的那样, hasOwnProperty 应该可以解决问题。这是一个类似的问题
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |