将JavaScript代码迁移到具有String.prototype扩展名的node.js模块

Migrating JavaScript code to node.js modules with String.prototype extension

本文关键字:扩展名 prototype node 模块 js String 代码 JavaScript 迁移      更新时间:2023-11-25

我正在尝试将基于Crockfords TDOP的解析器迁移到Node.js,因为我想将其用作我自己的解析器的基础。

在他的代码中,他用一种名为"tokens"的新方法扩展了String对象:

String.prototype.tokens = function (prefix, suffix) {
[...]

来源:https://github.com/douglascrockford/TDOP/blob/master/tokens.js#L25

这个方法稍后会被他的解析器调用:

[...]
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/parse.js#L520

在浏览器版本中,他只需加载所有似乎添加到全局范围的文件,就可以正常工作:

https://github.com/douglascrockford/TDOP/blob/master/index.html#L58

我现在正试图让它在Node中工作。为此,我开始剥离基于浏览器的内容,并从文件系统中读取一个示例文件。

它似乎做了一些事情,直到String.tokens方法被调用,在那里我得到了'my string' has no method 'tokens'。在我对作用域的有限理解中,我怀疑这是因为节点似乎为每个模块创建了自己的"全局"作用域。我现在最大的问题是,我如何扩展String对象,以实现这一点?我在示例代码中尝试在许多不同的范围中定义这个方法,但我无法使其中任何一个工作。我的想法是将解析方法作为一个模块,然后从该文件中分配String.prototype.tokens == mymodule.tokens

这是正确的方法吗?如果是,我在哪里定义String.prototype.tokens方法,我的代码才能找到它?

我已经用我的节点代码创建了一个github存储库,欢迎拉取请求;)

https://github.com/ktk/js-scope-test/blob/master/node.js

正如Bubbles所指出的那样,这一直有效。我忘了对从fs.readFile…得到的Buffer对象调用toString()

对不起&谢谢你的提示。