【发布时间】:2016-07-12 16:27:33
【问题描述】:
又一个instanceof 问题。
我正在使用来自 antlr4 解析器的一些自动生成的代码。解析器工作正常,我将它与 ace 连接在一起,语法高亮工作,......到目前为止一切都很好。但是现在发生了一件非常奇怪的事情。我写了自己的parserTreeListener,但由于instanceof 调用返回错误结果而失败。
将问题分解为一个小程序是可行的。但就像魔术一样,即使使用相同的代码(解析器、词法分析器、侦听器......),一切都很好。
不足为奇,在 chrome devtools 中调试问题,显示对象 t 原型链 (__proto__) 确实是 TerminalNode 的一个实例,但调用 t instanceof TerminalNode 仍然返回 false。
不幸的是,我无法发布主项目的代码,它失败了(至少现在还没有)。也许有人知道为什么以及何时会出现此类问题。
一些可能的解释(尽管我怀疑)
- 脚本加载了两次,TerminalNode 不等于 proto 的 TerminalNode
- 与工作线程中加载的同一个库发生冲突
antlr4 中的这段代码失败了:
ParseTreeWalker.prototype.walk = function(listener, t) {
var errorNode = t instanceof ErrorNode ||
(t.isErrorNode !== undefined && t.isErrorNode());
if (errorNode) {
listener.visitErrorNode(t);
} else if (t instanceof TerminalNode) { /*here t fails on first TerminalNode*/
listener.visitTerminal(t);
} else {
this.enterRule(listener, t);
for (var i = 0; i < t.getChildCount(); i++) {
var child = t.getChild(i);
this.walk(listener, child);
}
this.exitRule(listener, t);
}
};
一些调试信息
当我键入时,两个脚本在断点处返回相同的结果:
$ var obj = t; while(obj) console.log(obj = Object.getPrototypeOf(obj));
TerminalNode {}
ParseTree {}
SyntaxTree {}
Tree {}
Object {}
Object {}
【问题讨论】:
-
t.prototype === TerminalNode.prototype说什么? -
instanceof和.isPrototypeOf不一样!编辑:好的,只有你的问题标题令人困惑。 -
false在这两种情况下:t instanceof TerminalNode true t.prototype === TerminalNode.prototype false即使在它工作的示例中,也可以,因为t是TerminalNodeImpl的一个实例 -
你找到这个问题的答案了吗?
-
@Nayan 正如下面的答案所述......脚本被多次加载,覆盖了原始定义,从而导致了这个混乱。
标签: javascript antlr4 instanceof