2017-08-23 5 views
1

以下のモジュールで、公開されていない関数を追加するにはどうすればよいですか?これは明らかなモジュールではありません。ロールを公開したくないとします。ロールとしては正しいとは言えません。しかし、それを隠す方法は?JavaScriptモジュールプライベート関数

/* global module */ 

module.exports = (function() { 
    'use strict'; 
    var random; 

    function Dice(random) { 
    this.init(random); 
    } 

    Dice.prototype.init = function (random) { 
    this.random = random || Math.random 
    }; 

    Dice.prototype.d20 = function() { 
    var max = 20; 
    var min = 1; 
    return this.roll(min, max); 
    }; 

    Dice.prototype.d6 = function() { 
    var max = 6; 
    var min = 1; 
    return this.roll(min, max); 
    }; 

    Dice.prototype.roll = function(min, max) {   
    return Math.floor(this.random() * (max - min)) + min; 
    }; 

    return Dice; 
}()); 
+1

この試すことができます: '機能ロール(MIN、MAX)を{*)(Math.floor(this.randomを返します(max-min))+ min; }; ' – styfle

+1

これは明らかに見えるプロトタイプパターンです。どうしてあなたがそこに関数を宣言できないと思うのか分かりません。たとえば、[こちら](https://stackoverflow.com/questions/9248655/how-to-implement-inheritance-in-js-revealing-prototype-pattern/9321429#9321429)をご覧ください。 – Bergi

+2

IIFEは省略してください。 Commonjsモジュールでは、モジュール全体が独自のスコープを持ちます。だから、ラッピングをせずにすべてを直接ファイルに入れてください。最後に 'module.exports = Dice'を割り当てます。 – Bergi

答えて

1

私的機能は実際にはJavaScriptの一部ではありません。しかし、あなたは一種の.. ..ここでは例があり、それらをエミュレートする

var Roller = (function() { 
 
    
 
    //constructor 
 
    function Roller(name) { 
 
    this.name = name; 
 
    } 
 
    
 
    //public method 
 
    Roller.prototype.callPrivate = function() { 
 
    //just need to remember to pass this 
 
    //to our private functions 
 
    private_roll(this); 
 
    } 
 
    
 
    //private function 
 
    function private_roll(that) {  
 
    console.log(that.name); 
 
    } 
 

 
    //lets return our class. 
 
    return Roller; 
 
})(); 
 

 
    
 
var roller = new Roller('Test Me!'); 
 
roller.callPrivate(); 
 

 
//these will fail, 
 
//private_roll(roller); 
 
//roller.private_roll(roller); 
 
//IOW: no acces to private_roll from outside 
 
//the closure..

+0

ありがとう。私が言ったように、いつか私がd17のような行動をしたくないと誰が知っているので、ジェネリックロールのためにそれをしたくないかもしれません! – FreddyNoNose

1

あなたがだけではなく、クラスのメソッドの正常な機能に作ることができるサイコロを知ってロールを必要としない場合。

module.exports = (function() { 
    function roll (min, max, random) { 
    return Math.floor(random() * (max - min)) + min 
    } 

    function Dice (random) { 
    this.init(random) 
    } 

    /** 
    * rest of your class definition 
    */ 

    Dice.prototype.d6 = function() { 
    var max = 6 
    var min = 1 
    return roll(min, max, this.random) 
    } 
})()) 
+0

なぜ私はそれをすることができなかったのかわかりません。私はあなたが言ったことを正確に行った前に、他のコードを見ました。私の記憶想起は悪くなってきています。 TY。 – FreddyNoNose

+1

それは私たちすべてに起こる:) –