javascript - 使用 JavaScript 模块模式时私有(private)方法应该放在哪里?

标签 javascript

我已经开始在我的一个项目中使用模块模式。据我了解,它是这样的:

var obj = (function(foo){
     //Some initialization logic up here.

     //Private methods
     var privateBazz = function(){
         return "I'm known only to this closure!";
     }();

     //Public methods
     return { 
         publicFoo: foo,
         publicBar: function(){
             return foo + privateBazz;
         }
     }
})();

这在纸面上看起来相当不错,而且在实践中似乎运作良好。顶部的初始化逻辑很直观,然后是私有(private)方法,然后是公共(public)方法。

不过,我遇到了一个问题。我应该如何从 return 语句范围之外和 obj 的函数声明范围内调用 publicFoo 或 publicBar?

我目前的解决方案是做类似的事情:

var obj = (function(foo){
     //Private methods declared early for use.
     var privateBazz = function(){
         return "I'm known only to this closure!";
     }();

     var privateBar = function(){
         return foo + privateBazz;
     };

     //Some initialization logic up here.
     var dependentOnBar = privateBar();

     //Public methods
     return { 
         publicFoo: foo,
         publicBar: privateBar
     }
})();

这行得通,但是我的私有(private)变量的声明突然放在了我的对象的私有(private)属性声明之上。如果我试图让私有(private)函数声明尽可能接近首先调用它们的代码,问题就会变得更加严重,所以我只是在顶部声明我需要的所有私有(private)函数,然后再初始化属性。同样,这可行,但我习惯于让代码尽可能接近执行点。所以,在顶部声明私有(private)函数 block 对我来说真的很尴尬。有没有其他人有这种感觉,或者这是我需要为 JavaScript 克服的问题?当我看到这种情况时,我应该采取什么措施吗?

最佳答案

听起来您可以通过简单地不使用对象表示法返回模块来解决这个问题,而是初始化它并在您进行时构建它。这将是这样的:

var obj = (function(foo){
     var self = {};
     //Some initialization logic up here.

     //Private properties
     var foo = "only accessible within this scope";

     //Private methods
     var privateBazz = function(){
         return "I'm known only to this closure!";
     }();

     //Public Properties
     self.publicFoo = foo;

     //Public Methods
     self.publicBar = function(){
         return foo + privateBazz;
     };

     return self;
})();

关于javascript - 使用 JavaScript 模块模式时私有(private)方法应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732818/

相关文章:

javascript - 找不到带有排除模板 JAVA + Spring 的 CSS 和 JS 文件

javascript - 如何在原生 Android 应用程序上从 JS 中的 php 获取数据?

javascript - 在同一项目上多次调用时 scrollTop 跳转

javascript - 如何将 td id 值转移到另一个页面

javascript - 发送 GET 请求,同时读取流

asp.net - 从浏览器检测是否安装了特定应用程序

javascript - 如何在 javascript 中检测大写锁定而不将输入的内容与按下 Shift 进行比较?

javascript - 如何通过 jquery 以编程方式调用 mouseenter 事件

javascript - ExtJS Textarea - 在用户输入时自动保存内容

javascript - 使用 highcharts/highstock 中的按钮打开/关闭标志