如何在nodejs模块中访问私有代码?

时间:2016-07-09 13:03:35

标签: javascript node.js server-side

加载模块后如何访问模块的私有函数和数据?

我知道require函数加载模块并返回包含一些公共对象或函数的module.exports对象,但另一个' 私有 '访问模块中的部分代码?它位于记忆中的哪个位置?

2 个答案:

答案 0 :(得分:1)

TL; DR - NodeJS模块中的代码可以继续访问它们在模块中定义的非导出内容,因为它们和它们定义的函数关闭该数据。

详细说明:

NodeJS模块实际上是NodeJS在require时使用调用的大功能。 (它们只被称为一次,无论它们是require多少次。)JavaScript中的函数调用设置执行上下文和任何函数中创建关闭上下文(它们具有对它及其内容的持久引用)。只要任何东西都有引用,执行上下文就会在内存中存活,即使在“函数”返回之后也是如此。在执行上下文中创建的函数是“ closures ”。

所以说你有一个模块foo

var privateData = Math.random();
function publicFunction() {
    console.log("The private data is " + privateData);
}
module.exports.publicFunction = publicFunction;

而你require

var foo = require("foo");
foo.publicFunction(); // Displays the random number

这类似于拥有一个返回对象的函数:

function fooModule() {
    var privateData = Math.random();
    function publicFunction() {
        console.log("The private data is " + privateData);
    }
    return {
        publicFunction: publicFunction
    };
}
你打电话给:

var foo = fooModule();
foo.publicFunction(); // Displays the random number

同样的机制在两个地方都有效。

更多探索:

答案 1 :(得分:0)

模块的使用者只能与其API,a.k.a. exports 进行交互。您无法直接访问其私有函数和状态。这会违反封装。

模块本身可以为您完成。无论给定模块导出的任何函数都可以与该模块中的任何内容进行交互。

如果您来自Java或C#世界,请将其视为类中的公共/私有方法。在节点模块中,除非导出,否则所有内容都是“私有的”。