javascript - 对象字面量属性赋值奇怪 : what's happening here?

标签 javascript object constructor prototype object-literal

我正在编写一个单元测试(在 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);

我知道 oBackbone.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/

相关文章:

javascript - 使用 API 从视频 ID 获取 YouTube 文件 URL

javascript - 数组未定义,但可以通过控制台注销

javascript - 控制台显示 JavaScript 数组未定义,但我能够记录其内容

javascript 在数组中的对象之间保留某些属性

网格中的 Python 对象

javascript - React - 由于某种原因,Babel Polyfill 不会阻止 Set 或 Weakmap 上的异常,但会填充 Promise

javascript - setTimeout 不适用于 Angular5

c# - 将真值传递给 boolean 值

java - 调用当前类或父类(super class)的重载构造函数

java - 管理具有多个字段的类