加载模块后,如何访问模块的私有函数和数据?
我知道require函数加载模块并返回包含一些公共对象或函数的module.exports对象,但是如何访问模块中代码的其他“私有”部分?它在记忆中的位置?
发布于 2016-07-09 13:08:53
NodeJS模块中的TL;DR -代码可以继续访问它们在模块中定义的非导出的东西,因为它们和它们定义的函数关闭在该数据之上。
详细信息:
NodeJS模块实际上是NodeJS在调用它们时调用的大型函数。(不管它们是d的多少次,它们只被称为一次。)JavaScript中的函数调用设置执行上下文,并且在该上下文中创建的任何函数都关闭上下文(它们对上下文及其内容具有持久的引用)。只要任何东西都有对它的引用,即使在“函数”返回之后,执行上下文仍然存在于内存中。在执行上下文中创建的函数是“闭包”。
所以假设您有一个模块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同样的机制在两个地方都起作用。
更多要探讨的是:
发布于 2016-07-09 13:09:53
模块的使用者只能与其API即a.k.a交互。它出口的东西。您不能直接访问它的私有函数和状态。那就违反了封装。
模块本身可以为您完成此任务。由给定模块导出的任何函数都可以与该模块中的任何内容交互。
如果您来自一个Java或C#世界,请将其看作是类上的公共/私有方法。在节点模块中,除非导出,否则所有东西都是“私有”的。
https://stackoverflow.com/questions/38282104
复制相似问题