怎么理解模块中保护私有方法只向外暴露接口~

发布于 2022-09-04 12:45:16 字数 664 浏览 22 评论 0

就以 AMD 的模块为例:

define(function () {
    var test = {
        val: 233,
        
        getVal: function () {
            return this.val;
        },
        
        setVal: function () {
            this.val = 'abc';
        }
    };
    
    return test;
});
  1. 上边的做法是不是不好 不应该整个返回整个 test 对象 这样外部是可以直接操作 val 属性的 正确的做法是什么?~

  2. 我看大家都 return {}; 一个对象回去 这是为什么 不能直接 return function (){}; 回去吗 还是说返回对象的话是方便后续扩展~

  3. 如果我想在模块里写一个面向对象的话 最终不还是得返回这个对象以供外部去 new 吗 那这么说面向对象写法默认就是公开的呗~

  4. 能列举几点模块的优点和弊端吗 如果我都暴露出去了 原生的写法就比如面向对象 不就默认都是公开的吗~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无声情话 2022-09-11 12:45:16

上面那个做法等于没有用模块……js的私有变量都是用闭包来模拟的,你的上面那个改成这样就可以了。

define(function () {
    var val = 123;
    
    var test = {
        getVal: function () {
            return val;
        },
        
        setVal: function () {
            val = 'abc';
        }
    };
    
    return test;
});

这样的话,外面是无法直接访问到变量val的,只能通过你对外暴露的两个函数:getValsetVal来进行访问和修改。

返回对象的原因一个就是你说的方便扩展,还有一个就是对外暴露的api通常不止一个,除了对象还有别的玩意儿能实现吗?

至于return function (){};这是什么……没看懂。

街道布景 2022-09-11 12:45:16

最常见的的模块写法(利用自执行函数):

var module = (function(){
    var param = 1;
    
    function init(){....} // private function
    
    return {
        render: function(){...} // public function
    }

}());

上面的例子中,定义了模块的私有方法和对外接口/公共方法。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文