我正在编写一个单元测试(在 Mocha 中使用 Chai)来查看某个对象 o
是否是 instanceof
ClassY
。单元测试成功,但我可以让它失败,具体取决于我如何创建对象文字,尽管生成的对象文字是相同的。
我知道这有点含糊。让我解释一下。
ClassY
是对象的一部分,我们将其称为Parent
。这种关系看起来就像这样:
Parent: {
ClassY: function() {}
}
我使用 Underscore 扩展方法将 Parent
附加到 Backbone
:
_.extend(主干,父级)
这会导致 Backbone 具有 ClassY
属性,可以通过 Backbone.ClassY
访问该属性。
我的单元测试是:
expect(o).to.be.instanceof(Backbone.ClassY);
我知道 o
是 Backbone.ClassY
的一个实例。
如果我写的话它通过:
var Parent = {};
var ClassY = Parent.ClassY = function() {};
还有
var Parent = {};
var ClassY = function() {};
Parent.ClassY = ClassY;
但是当我编写以下内容时,单元测试失败:
var ClassY = function() {};
var Parent = {
ClassY: ClassY
};
失败的原因是:
TypeError: '[object Object]' is not a valid argument for 'instanceof'
(evaluating 'flag(this, 'object') instanceof constructor')
事实上,在 Chrome DevTools 中检查 Backbone 后我发现,在失败的情况下,ClassY
是一个对象。在成功的情况下,它是构造函数。
我想这是我无法理解的对象文字的一些简单属性。你知道这是怎么回事吗?
最佳答案
我不确定 Backbone 在这里做什么(基于 JS 中各种“类”/继承实现的知识,我有一些关于为什么会发生这种情况的想法,但我必须看看在图书馆)。
但是,我可以告诉您的是,这是库正在做的事情,而不是本质上与对象有关的事情。
这是你的证明:
var Parent_1 = {
ClassX : function () { this.x = "x"; }
},
ClassY = function () { this.y = "y"; },
Parent_2 = {
ClassY : ClassY
};
var littleX = new Parent_1.ClassX(),
littleY = new Parent_2.ClassY();
littleX instanceof Parent_1.ClassX;
littleY instanceof Parent_2.ClassY;
这两者都应该是正确的。
在 JS 中,当你执行以下操作时:
var x = {}, y = [];
x.y = y;
您为其提供对该对象的完全相同实例的引用(数字/字符串/ bool 值的工作方式不同)。
因此,x.y === y
为 true,而 {} === {}
为 false,即使两个对象具有相同的属性。
在backbone中,我可以想象你正在传递它,Backbone正在寻找一个构造函数并操纵它来附加帮助器或钩子(Hook),或者添加额外的继承或MVC功能/观察,等等。
因此,从另一端传来的并不是内存中完全相同的对象——它可能被埋在一个闭包中,然后 Backbone 可以戳到某个地方,并将其自身连接到该位置。再说一次,我还没有阅读源代码,但这是我的第一 react 。
关于javascript - 对象字面量属性赋值奇怪 : what's happening here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21128724/