我有这种奇怪的行为,希望你能帮助我。 =)
我有一个设置,我需要使用JavaScript
运行Mocha
测试。代码从TypeScript
生成,测试在浏览器和nodejs
中通过browserify
和commonjs
模块运行。问题是我想使用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在分配给操作的同一文件中运行,则代码将始终如一地工作。
任何人都可以复制这个错误,或解释我做错了吗?
干杯
答案 0 :(得分:2)
var action = MyViewAction();
您需要使用new
,即new MyViewAction
来调用它,但我怀疑您已经这样做了。
如果在Node中运行,testA将变为false,但如果在Chrome中运行则为true
我怀疑你定义了两个 MyViewAction
个函数。
在Chrome中,由于全局命名空间,最后一个获胜并且引用比较(instanceof
对MyViewAction
所做的)与MyViewAction
指向相同的功能。
在Node中,每个文件都是自己的模块,并且没有全局命名空间冲突,因此您有两个.name
函数,并且ref比较返回false,但因为它们的名称相同{{1} } string是一样的。