又一个instanceof
问题。
我正在使用 antlr4 解析器自动生成的一些代码。解析器工作正常,我将它与 ace 一起插入,语法突出显示工作,...到目前为止一切顺利。但现在发生了一件非常奇怪的事情。我编写了自己的 parserTreeListener
,但由于 instanceof
调用返回错误结果而失败。
将问题分解为一个小程序是可行的。但就像魔术一样,即使使用相同的代码(解析器、词法分析器、监听器……),一切都很顺利
不够奇怪,在 chrome devtools 中调试问题,显示对象 t
原型(prototype)链 (__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 {}
最佳答案
a instanceof b
检查 a
是否继承自 b.prototype
,而不是继承自 b
。
如果你想测试b
本身是否出现在a
的原型(prototype)链中,可以使用
b.isPrototypeOf(a);
一些例子:
[] instanceof Array; // true
Array.isPrototypeOf([]); // false
Object.getPrototypeOf([]) === Array; // false
[] instanceof Array.prototype; // TypeError
Array.prototype.isPrototypeOf([]); // true
Object.getPrototypeOf([]) === Array.prototype; // true
关于javascript - 即使 b 在 a 的原型(prototype)链中,a instanceof b也会返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334401/