
[code]

    function A(){};
    
    A.prototype.a = function() {
      // 他のなんらかの処理
    
      // A.prototype._bの呼び出し
      this._b();
    };
    
    A.prototype._b = function() {};
    
[/code]

`A.prototype._b` は `A.prototype.a` でのみ利用され、 Node や Browserify で `require('A')`
として扱うモジュールを想定しています。( `module.exports` は省略します)

この場合 `A.prototype._b` はどう書くのが望ましいといえるでしょうか。

上記のコードは個人的には違和感があり、

  * パブリックであること
  * 1度しか呼び出さないのにも関わらずメソッドであること

などが挙げられます。それらを解決するとなれば、

**ex1: プライベートで、関数にした場合**

[code]

    function A(){};
    var _b = function();
    
    A.prototype.a = function() {
      _b();
    };
    
[/code]

のようなコードや、

**ex2: ベタ書きで問題ないと判断した場合**

[code]

    function A(){};
    // var _b = function();
    
    A.prototype.a = function() {
      // _b()と同様の処理をここにベタ書き
    };
    
[/code]

といったコードが思い浮かびます。

しかし、

  * `var _b = func~`とするのは独立していて違和感がある
  * であれば `A._b = func~` のような形はどうか
  * いずれも納得できないのであれば、「1回だけ呼び出すならなんでもかんでもベタ書き」ということでいいのか

このようにどうすべきなのか判断がつきません。

これでは自分の中で考えても仕方がないので、結局のところこのケースでは `A.prototype._b`
はどう書くのがベストなのか教えていただけないでしょうか。

JavaScript なのでそこまでプライベートにこだわっているわけではなく、一般的な実装として望ましい形を知りたいと思っています。

よろしくお願いします。


CC BY-SA 3.0
2015-01-27T16:40:14.873
5455
2015-01-28T03:00:37.047
2015-01-27T17:39:28.290
4978
7873
question
javascript
1回だけ呼び出される内部のメソッドはどう書くべきなのか


JavaScriptそんなに詳しくないですが書いてみました。スコープを制限してそれっぽく見せる作戦

[code]

    var A = function() {}
    (function(A){
        var b = function(obj) { console.log('name=' + obj.name); };
        A.prototype.a = function() { b(this); }
     })(A);
    
    var b = new A();
    b.name = 'fkm';
    b.a(); // name=fkmをログに出力
    
[/code]


CC BY-SA 3.0
2015-01-27T17:12:20.363
5460
2015-01-27T17:12:20.363
845
5455
answer


こちらの方が「bはメソッドaでしか使わない！」になりますね。。

[code]

    var A = function() {}
    A.prototype.a = (function() { 
        var b = function(obj) { console.log('name=' + obj.name); };
        return function() { b(this); }
    })();
    
    var c = new A();
    c.name = 'fkm';
    c.a(); // name=fkmをログに出力
    
[/code]


CC BY-SA 3.0
2015-01-27T17:35:37.910
5461
2015-01-27T17:35:37.910
845
5455
answer


モジュールの書き方と絡めて、2 通り挙げたいと思います。

## 例 1

たぶん、一般的なのかなと思われる形式です。モジュール自体の基本形は、

[code]

    (function () {
       this.moduleA = function () {};
    }());
    
[/code]

もしくは、

[code]

    (function () {
       this.moduleB = {};
    }());
    
[/code]

もしくは、

[code]

    var moduleC = (function () {
       return {};
    }());
    
[/code]

などとすればよいでしょう。

上記のうち、`moduleC` のパターンを取り、プライベートなメソッドを含めた初期化の記述サンプルを下に示します。（私は、変数名の後ろに `_`
を付けることをプライベートな変数の命名ルール  
としています。）

[code]

    var moduleC = (function () {
      var module = {};
    
      // PRIVATE
      function b_() {
      };
    
      // PUBLIC
      module.a = function() {
        b_();
      };
    
      return module;
    }());
    
[/code]

一般的なモジュールの書き方は、[Eloquent JavaScript: Chapter 10 -
Modules](http://eloquentjavascript.net/10_modules.html) が参考になると思います。

## 例 2

以下は、「一般的ではない」と思います。以下の例では、プライベートメソッドは隠されてはいません。ただ、この書き方はパフォーマンスが良いし、ソースコード解析ができるので、私は個人的にこっちを好んでいます。

[code]

    (function () {
      /**
       * @public
       * @constructor
       */
      A = function(){};
    
      /** @public */
      A.prototype.a = function() {
        // ...
        this.b_();
      };
    
      /** @private */
      A.prototype.b_ = function() {
        console.log( this)
      };
    }());
    
[/code]

ここから考えると、足りないのは、 [jsdoc](http://usejsdoc.org/tags-private.html) の記述だけかなと感じました。


CC BY-SA 3.0
2015-01-27T23:28:21.350
5467
2015-01-28T03:00:37.047
2015-01-28T03:00:37.047
4978
4978
5455
answer