例如,看一下我实现的一个简单栈的例子:
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;
})();
通过使用这种方法,我可以确保没有人能够(无论是意外还是故意地)操纵“私有”字段,比如min和head。我还可以利用私有函数,例如Node(),而不需要将其公开。
我了解到,这种方法会因为每个新对象都要维护一个额外的作用域而占用更多内存。这需要额外的内存吗?这种方法是否不好?
我尝试通过使用原型来优化它,而不是在创建新对象时创建函数。换句话说,我没有将函数作为MyStack构造函数的一部分。
我的问题是,这是不良设计吗?这种方法是否存在任何重大缺陷?