【问题标题】:Prototyping Built-In Modules in NodeJS在 NodeJS 中对内置模块进行原型设计
【发布时间】:2011-06-19 10:54:00
【问题描述】:

我一直在尝试在 Node 的文件系统模块中添加一些便利功能(主要是因为它缺乏一些常识性的东西),但是每次我在 repl 中开始 fs.prototype.myfunc = 时,Node 都会抱怨我试图设置一个未定义变量的属性。你真的不能从外部访问 Node 的内置模块原型吗?如果是这样,是否有人知道扩展 Node 内置模块的可行解决方法?

请注意:在尝试制作原型之前,我确实需要 fs!

var fs = require('fs');
fs.prototype.myfunc = function() {}; //TypeError thrown here

【问题讨论】:

    标签: javascript node.js prototype-programming


    【解决方案1】:

    响应 require('') 得到的结果取决于特定的模块。一些模块会这样做:

    module.exports = function() {}
    

    在这种情况下,返回的值将是函数,因此会有一个可以附加东西的原型。

    其他模块只是在已经存在的exports.module 对象上设置值。例如:

    module.exports.someFunc = function(){}
    

    module.exports 本质上只是:

    module.exports = {}
    

    对于 fs 模块,他们执行后者:

    var fs = exports;
    
    ....
    
    fs.readFileSync = function(path, encoding) {
    

    所以你得到了你所做的错误,因为返回的对象不是一个函数。如果你这样做,你会得到同样的错误:

    var x = {};
    
    x.prototype.myfunc = function(){}
    

    请注意,您可以这样做:

    var fs = require('fs');
    
    fs.myFunc = function(){} 
    

    【讨论】:

    • 当然!快速测试表明您是绝对正确的(而且我显然对 JS 的了解并不像我想象的那么多)。感谢您指出并解释!
    【解决方案2】:

    可能有一种解决方法,但 node 通过不让您对其模块进行猴子修补来向您发送消息。执行require('fs-monkeypatch') 以在require('fs') 中获取额外功能是令人困惑的。只需在 fs 模块之外添加您的函数即可。

    【讨论】:

    • 点了。有点令人失望的是你不能仅仅扩展模块(阅读:不要用邪恶的函数替换当前函数),但我确信这样做是有原因的。我可能会接受您的建议并将函数添加到我需要它们的文件中。感谢您的意见!
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多