2015-05-29 26 views
1

我有这种奇怪的行为,并希望你能帮助我。 =)节点与Chrome,实现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"; 
} 

的事情是,如果调用函数foo在不同commonjs模块, testA成为false如果运行Nodetrue如果Chrome运行,而 testB是在两种情况下true

如果foo与分配给动作的文件在同一个文件中运行,则代码将一致地工作。

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

干杯

+0

对'MyViewAction'的引用在两种情况下都存在吗? – Sirko

回答

2

变种行动= MyViewAction();

你需要给它打电话newnew MyViewAction但我怀疑你已经这样做了。如果运行节点,但如果真正运行在Chrome

我怀疑你有定义两个MyViewAction功能

种皮为假。

  • 在Chrome中,由于全局命名空间的最后一个胜和参照比较(这是什么instanceof那样),以MyViewAction指向相同的功能。

  • 在节点的每个文件都是自己的模块并没有全局命名空间冲突,因此,你有两个MyViewAction功能和裁判比较返回false,但因为它们被命名为相同的.name字符串是一样的。

+0

是的,对不起,我没有在描述中忘记'新'。 – tugend

+0

这是一个很好的猜测,可能有两个MyViewAction的定义,但我不认为是这样。我回去做了一些更多的测试,看起来如下: **如果foo的定义在另一个文件中,action实例的ViewAction **计算结果为true, 。 另外我可以保证在MyViewAction定义的代码库中只有一个地方。 – tugend

+0

我觉得这很奇怪,因为构造函数的名字和我添加到MyViewAction的东西显然是可用的。=/ – tugend