Node vs Chrome,实现instanceof,多个文件

时间:2015-05-29 08:05:20

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

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

我有一个设置,我需要使用JavaScript运行Mocha测试。代码从TypeScript生成,测试在浏览器和nodejs中通过browserifycommonjs模块运行。问题是我想使用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";
}

问题是,如果在另一个commonjs模块中调用foo, testA如果在false中运行,则Node变为true,如果在Chrome中运行,则testB变为true 在这两种情况下,windowManager.owners[prop] 都是windowManager

如果foo在分配给操作的同一文件中运行,则代码将始终如一地工作。

任何人都可以复制这个错误,或解释我做错了吗?

干杯

1 个答案:

答案 0 :(得分:2)

  

var action = MyViewAction();

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

  

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

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

  • 在Chrome中,由于全局命名空间,最后一个获胜并且引用比较(instanceofMyViewAction所做的)与MyViewAction指向相同的功能。

  • 在Node中,每个文件都是自己的模块,并且没有全局命名空间冲突,因此您有两个.name函数,并且ref比较返回false,但因为它们的名称相同{{1} } string是一样的。