将JavaScript代码迁移到具有String.prototype扩展名的node.js模块
Migrating JavaScript code to node.js modules with String.prototype extension
我正在尝试将基于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
对不起&谢谢你的提示。
- TableExport jquery插件:文件名和扩展名问题
- 未捕获的类型错误:无法读取属性'addEventListener'的null chrome扩展名
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 从安卓设备将图像上传到服务器时,文件扩展名错误
- 有人能告诉我如何在cent-os中打开扩展名为.dat的FIle吗
- 在上传之前,我可以在代码中的哪里将文件扩展名更改为小写
- TypeScript解释了各种文件扩展名
- 保存输入字段Chrome扩展名
- Web浏览器扩展名通用文件
- '的文件格式和扩展名;file.xls'don't与fileSaver.js匹配
- 如何通过chrome扩展名获取所有CSS和Javascript文件
- 如何从 URL 中获取文件名和扩展名
- 在javascript中检查文件扩展名的问题
- 在 iFrame 中注入 JS 文件,通过 Google chrome 扩展名中的 ContentScript 进行
- 如何使用office.js检查未保存文件的具体文件扩展名
- 用于检查文件扩展名不工作的Javascript If语句
- 如何从chrome扩展名读取文件
- 忽略文件扩展名的正则表达式
- PhantomJS无法打开扩展名未知的本地文件
- 将JavaScript代码迁移到具有String.prototype扩展名的node.js模块