我试图将基于Crockfords TDOP的分析器迁移到Node.js,因为我想将它用作我自己的分析器的基础。使用String.prototype扩展将JavaScript代码迁移到node.js模块
在他的代码,他伸出一个所谓的新方法String对象 “令牌”:
String.prototype.tokens = function (prefix, suffix) {
[...]
来源:
[...]
return function (source) {
tokens = source.tokens('=<>!+-*&|/%^', '=<>&|');
token_nr = 0;
new_scope();
advance();
var s = statements();
advance("(end)");
scope.pop();
return s;
};
[...]
:
https://github.com/douglascrockford/TDOP/blob/master/tokens.js#L25
,此方法被他的解析器后来被称为
来源:https://github.com/douglascrockford/TDOP/blob/master/parse.js#L520
在浏览器v他简单地加载所有那些似乎要加入到全球范围内的文件版为使一切工作正常:
https://github.com/douglascrockford/TDOP/blob/master/index.html#L58
我现在试图让这个在节点工作。为此,我开始剥离基于浏览器的东西,并从文件系统读取示例文件。
它似乎做了一些事情,直到String.tokens方法被调用,在那里我得到'my string' has no method 'tokens'
。在我对范围的有限理解中,我怀疑这是因为节点似乎为每个模块创建了自己的“全局”范围。我现在最大的问题是如何以这种方式扩展字符串对象?我试着在我的示例代码的许多不同范围内定义这种方法,但我无法让它们中的任何一个工作。我的想法是将解析方法作为一个模块,然后从该文件中分配String.prototype.tokens == mymodule.tokens
。
这是正确的做法,如果是这样,那么我该如何定义String.prototype.tokens
方法,我的代码将能够找到它?
我创建了一个GitHub的仓库与我的节点代码,请求拉欢迎;)
https://github.com/ktk/js-scope-test/blob/master/node.js
对于它的价值,我强烈建议不要扩展这样的对象。我之前做过的事情我以为肯定会是无害的,并且很难忍受奇怪的问题,而这些问题需要很长时间才能追踪到。 – Brad
一些快速测试表明,在一个模块中扩展一个本地对象在导入它的任何模块中都会有相同的效果(我正在运行v0.10,因为它的价值)。你究竟想要在字符串上调用“标记”?我无法在代码中看到这样的调用;只是在parse.js的开头增加了方法。 – Bubbles
电话是在这里:https://github.com/ktk/js-scope-test/blob/master/parse.js#L528 –