例えば、スタックの私の単純な実装を見てみましょう:この方法を使用することによりカプセル化をエミュレートするためにクロージャを使用していますか?
var MyStack = (function() {
var min;
var head;
// Constructor
function MyStack() {
this.size = 0;
}
MyStack.prototype.push = function(val) {
var node = new Node(val);
if (typeof min === 'undefined' || val < min) {
min = val;
}
++this.size;
if (typeof head === 'undefined') {
head = node;
} else {
node.next = head;
head = node;
}
};
MyStack.prototype.pop = function() {
if (typeof head === 'undefined') {
throw new Error('Empty stack');
}
--this.size;
var data = head.data;
head = head.next;
return data;
};
MyStack.prototype.min = function() {
if (typeof min === 'undefined') {
throw new Error('Min not defined');
}
return min;
};
MyStack.prototype.peek = function() {
if (typeof head === 'undefined') {
throw new Error('Empty stack');
}
return head.data;
};
function Node(data) {
this.data = data;
this.next;
}
return MyStack;
})();
、私は誰のような「プライベート」のフィールドを操作する(偶然または故意に)することができないことを確認することができます分と頭。私は、公開する必要のないNode()などのプライベート関数を利用することもできます。
これは、MyStack用に作成された新しいオブジェクトごとに追加のスコープを維持する必要があるという理由だけで、より多くのメモリを使用することを読んでいます。このように多くの余分なメモリが必要ですか?
新しいオブジェクトが作成されるたびに関数を作成するのではなく、プロトタイプを使用して最適化しようとしました。言い換えれば、私はMyStackのコンストラクタの一部として関数を含めていませんでした。
私の質問は、この貧弱なデザインですか?この方法論に大きな欠点はありますか?
「カプセル化をエミュレートする」とは、おそらく「カプセル化を実装する」という意味ですか?私はどのように見ていないので、これはカプセル化ではありません。 – ruakh