javascript - 即使 b 在 a 的原型(prototype)链中,a instanceof b也会返回 false

标签 javascript antlr4 instanceof

又一个instanceof问题。 我正在使用 antlr4 解析器自动生成的一些代码。解析器工作正常,我将它与 ace 一起插入,语法突出显示工作,...到目前为止一切顺利。但现在发生了一件非常奇怪的事情。我编写了自己的 parserTreeListener,但由于 instanceof 调用返回错误结果而失败。

将问题分解为一个小程序是可行的。但就像魔术一样,即使使用相同的代码(解析器、词法分析器、监听器……),一切都很顺利

不够奇怪,在 chrome devtools 中调试问题,显示对象 t 原型(prototype)链 (__proto__) 确实是 TerminalNode 的实例,但调用 t instanceof TerminalNode仍然返回falsehere it works here it doesn't

不幸的是,我无法发布主项目的代码,它失败了(至少还没有)。也许有人知道为什么以及何时会出现此类问题。

一些可能的解释(尽管我怀疑)

  • 脚本加载了两次,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/

相关文章:

javascript - 如何获取 XML 中的 "xx:creator"值?

javascript - 单击 jQuery 中的文本时如何允许单个更改 css 样式?

javascript - 将任何元素置于水平滑动线上居中

java - 为什么我添加了 "cppInclude"解析器然后整个 g4 不起作用

parsing - 递归地使用 Antlr4 解析器和监听器

java - java中判断一个类的父类(super class)是否实现了某个接口(interface)

javascript - 快速获取文件路径的正则表达式

c++ - antlr4中的ParseTree遍历

javascript - JavaScript 中 typeof 和 instanceof 的区别

Java instanceof false 如果有父