2016-06-17 18 views
-1

次の記事を読んだ後、 http://javascriptplayground.com/blog/2012/04/javascript-module-pattern/ JSでモジュールを実装することにしました。JSモジュールの非公開変数

残念ながら、私が使用していますモジュールは、あなたが見ることができるように、私は popoverOptionsModule._stopAskingListの値を変更し、更新を記録することができる午前

var popoverOptionsModule = (function() { 
var _stopAskingList = []; 

var addToStopAskingList = function(itemToAdd) { 
    if (_stopAskingList.indexOf(itemToAdd) === -1){ 
     _stopAskingList.push(itemToAdd); 
    } 
} 

var getStopAskingList = function() { 
    return _stopAskingList; 
} 


return { 
    addToStopAskingList: addToStopAskingList, 
    getStopAskingList: getStopAskingList, 
}; 
})(); 

popoverOptionsModule._stopAskingList = 4; 
console.log(popoverOptionsModule._stopAskingList); 

、プライベート変数のプライベートを維持していないようですコンソールに...私はこれが起こるはずではないと思った。ご協力いただきありがとうございます!

+0

'console.log(popoverOptionsModule.getStopAskingList())'を試してください。これが最初にゲッター関数を実装した理由です。 'popoverOptionsModule._stopAskingList = 4;を実行することで – JJJ

+3

を作成すると、オブジェクトに新しいプロパティが作成されるので、もちろんconsole.logでもそれを行うことができます。その行を削除すると、期待どおりに定義されていないログに記録されます。 – GillesC

+2

私はこれが落ちた理由を見ません。ポスターが体験している問題は非常にはっきりしていて、それにさらされることなくすぐに明らかな概念でもありません。はい、JavaScriptを使用して作業するほとんどの人は頻繁に公開されていますが、公開されていないことについて質問するのは完全に関連しています。 – Claies

答えて

2

JSは完全に動的型付けされているので、あなたがライン

popoverOptionsModule._stopAskingList = 4; 

を持っているとき、あなたはこの変数を作成し、値を割り当てた、それゆえ、なぜ次の行が成功します。この行がなければ、後続のconsole.logは未定義を報告します。このコードは、あまりにも

popoverOptionsModule._abc = 4; 
console.log(popoverOptionsModule._abc); 

これは、むしろそれは、発信者からそれを隠すためにしようとするだけのAPIパターンだ、オブジェクト指向言語は、保護レベルを実装するのと同じ方法で、実際にプライベート変数ではないことに注意してください動作します。

関連する問題