2017-08-23 104 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

試試這個:'函數輥(最小值,最大值){返回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

它發生在我們身上:) –

相關問題