【问题标题】:Node vs Chrome, implementation of instanceof, multiple filesNode vs Chrome,instanceof的实现,多个文件
【发布时间】:2015-05-29 08:05:20
【问题描述】:

我有这种奇怪的行为,希望你能帮助我。 =)

我有一个设置,我需要使用Mocha 运行JavaScript 测试。代码从TypeScript 生成,测试通过browserifycommonjs 模块在浏览器和nodejs 中运行。问题是我想使用instanceof,但显然行为会有所不同,具体取决于代码是在Node 还是Chrome 中运行。示例如下。

// file Actions.ts
Class Action {..}
Class ViewAction extends Action {..}
Class MyViewAction extends ViewAction {..}

// file App.ts
var action = new MyViewAction(); 

// file App.ts or Elsewhere.ts
foo(action) {
    var testA = action instanceof MyViewAction;
    var testB = (<any>action.constructor).name === "MyViewAction";
}

问题是,如果 foo 在不同的 commonjs 模块中被调用, 如果在 Node 中运行,testA 将变为 false,但如果在 Chrome 中运行,则 true,而 testB 在这两种情况下都是 true

如果 foo 与 action 分配到的文件在同一个文件中运行,则代码会始终如一地工作。

谁能复制这个错误,或解释我做错了什么?

干杯

【问题讨论】:

  • 在这两种情况下都存在对MyViewAction 的引用?

标签: javascript node.js google-chrome typescript instanceof


【解决方案1】:

var action = MyViewAction();

您需要使用newnew MyViewAction 调用它,但我怀疑您已经在这样做了。

testA 如果在 Node 中运行则为 false,但如果在 Chrome 中运行则为 true

我怀疑你定义了 两个 MyViewAction 函数。

  • 在 Chrome 中,由于全局命名空间,最后一个获胜,并且通过引用比较(这是 instanceof 所做的)到 MyViewAction 指向相同的函数。

  • 在 Node 中,每个文件都是自己的模块,并且没有全局命名空间冲突,因此您有两个 MyViewAction 函数,并且 ref 比较返回 false,但由于它们的名称相同,.name 字符串相同.

【讨论】:

  • 是的,抱歉,我确实忘记了描述中的“新”。
  • MyViewAction 可能有两个定义,这是一个很好的猜测,但我认为不是这样。我回去做了一些更多的测试,似乎: action instance ViewAction 评估为真,如果 foo 的定义在另一个文件中。我也可以保证在代码库中只有一个地方定义了 MyViewAction。
  • 我认为这很奇怪,因为构造函数名称和我添加到 MyViewAction 的任何东西显然都是可用的。 =/
  • 我想知道 App.ts 和 Elsewhere.ts 中对 require('MyViewAction') 的两次调用是否会以某种方式生成两个 MyViewAction 函数?两种不同的语境?
猜你喜欢
  • 2011-08-28
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多