Например, взгляните на мой простой реализации стека:Использует закрытие для эмуляции инкапсуляции плохая идея?
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