8

所以我有一个简单的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它会返回falsetypeof 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类似数组的对象时得到的 console.log isPlainObject

注销 <code>arguments</code> 对象

查看日志似乎表明该数组现在有两个参数。但长度仍为1.

4

1 回答 1

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 应该可以解决问题。这是一个类似的问题

于 2013-05-18T11:19:14.030 回答