跨文件共享私有对象

本文介绍了一种在模块化JavaScript代码中实现跨文件共享私有对象的方法,通过使用闭包和特定的解锁与锁定机制确保了私有数据的安全性和模块的可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跨文件共享私有对象

通过上面的例子,我们知道,如果一个module分割到多个文件的话,每个文件需要保证一样的结构,也就是说每个文件匿名函数里的私有对象都不能交叉访问,那如果我们非要使用,那怎么办呢? 我们先看一段代码:

var blogModule = (function (my) {
    var _private = my._private = my._private || {},
        
        _seal = my._seal = my._seal || function () {
            delete my._private;
            delete my._seal;
            delete my._unseal;
            
        },
        
        _unseal = my._unseal = my._unseal || function () {
            my._private = _private;
            my._seal = _seal;
            my._unseal = _unseal;
        };
        
    return my;
} (blogModule || {}));

任何文件都可以对他们的局部变量_private设属性,并且设置对其他的文件也立即生效。一旦这个模块加载结束,应用会调用 blogModule._seal()"上锁",这会阻止外部接入内部的_private。如果这个模块需要再次增生,应用的生命周期内,任何文件都可以调用_unseal() ”开锁”,然后再加载新文件。加载后再次调用 _seal()”上锁”。

### C/C++ 中 `static` 静态变量实现跨文件数据共享 #### 局部静态变量的作用范围 当使用 `static` 关键字修饰局部变量时,该变量仅在其定义的函数内部可见并保持其值在多次调用间持久存在[^1]。 然而,对于多文件项目中的数据共享需求而言,这种方式并不适用。因为局部静态变量的作用域被严格限定于单个函数体内。 #### 文件作用域内的静态全局变量特性 如果希望某个变量只在一个源文件内有效而不允许外部访问,则可以利用 `static` 来声明具有文件作用域(file scope)的全局变量。这种情况下,即使其他 .c 或 .cpp 文件包含了相同的头文件也无法直接操作此变量[^2]。 但是这同样不是解决跨文件共享的理想方案,因为它实际上阻止了不同编译单元之间的交互可能性。 #### 正确做法:通过指针传递或公共接口暴露 为了安全有效地实现在多个文件间的静态变量共享,推荐采用如下策略之一: - **创建一个专门负责管理这些资源的模块**,并将实际的数据成员设为私有(static),对外提供必要的存取方法; ```cpp // resource_manager.h #ifndef RESOURCE_MANAGER_H_ #define RESOURCE_MANAGER_H_ class ResourceManager { private: static int sharedData; public: static void initialize(int value); static int getSharedValue(); static void setSharedValue(int newValue); }; #endif //RESOURCE_MANAGER_H_ ``` ```cpp // resource_manager.cpp #include "resource_manager.h" int ResourceManager::sharedData = 0; void ResourceManager::initialize(int value){ sharedData = value; } int ResourceManager::getSharedValue(){ return sharedData; } void ResourceManager::setSharedValue(int newValue){ sharedData = newValue; } ``` - 使用 extern 声明加上初始化,在单一 cpp 文件中真正定义一次这样的全局对象/变量;而在其它地方只需要声明即可正常使用它。 ```cpp // global_data.h #ifndef GLOBAL_DATA_H_ #define GLOBAL_DATA_H_ namespace Global{ extern int data; // 只是声明 } #endif //GLOBAL_DATA_H_ ``` ```cpp // main.cpp or any other single implementation file #include "global_data.h" namespace Global{ int data = 42; // 实际定义与赋初值的地方 } ``` 上述两种方式都能很好地满足跨文件间的安全性和灵活性要求,同时也遵循良好的编程实践原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值