예를 들어, 스택의 내 간단한 구현에 대해 살펴 :이 방법을 사용클로저를 사용하여 캡슐화를 에뮬레이트하는 것은 나쁜 생각입니까?
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()와 같은 private 함수를 사용할 수 있습니다.
나는 이것이 MyStack을 위해 생성 된 각각의 새로운 개체에 대해 추가 범위를 유지해야하기 때문에 더 많은 메모리를 사용할 것이라고 읽었습니다. 이 방법으로 너무 많은 추가 메모리가 필요합니까?
새로운 개체를 만들 때마다 함수를 만드는 대신 프로토 타입을 사용하여 최적화하려고했습니다. 즉, MyStack 생성자의 일부로 함수를 포함하지 않았습니다.
내 질문은이 가난한 디자인입니까? 이 방법론에 큰 단점이 있습니까?
"에뮬레이션 캡슐화"는 "캡슐화 구현"을 의미할까요? 왜냐하면 나는 어떤 방식으로 보지 않기 때문에 이것은 캡슐화가 아닙니다. – ruakh