【发布时间】:2012-09-28 18:31:45
【问题描述】:
考虑到具有私有属性的对象创建模式,一种方法是:
function MyStack (){
var list = [],
index = 0;
this.push = function(val){
return list[index++] = val;
};
this.pop = function(){// ...}
}
var stack1 = new MyStack(); stack1.push(5);
var stack2 = new MyStack(); stack2.push(11);
这个问题:Stack 的每个实例都有自己的方法“push”和“pop”的副本。
实现构造方法的另一种方式是:
function MyStack(){
this.list = [];
this.index = 0;
}
MyStack.prototype = {
insert: function(val){
return this.list[this.index++] = val;
},
pop:function(){//...}
}
这里的问题:我们失去了列表和索引的隐私。
有没有办法让我们可以在实例之间重用方法和属性的隐私?
我知道我们可以将这个用于不对对象的任何状态进行操作的方法,但我更多地谈论的是那些对状态进行操作的方法。
【问题讨论】:
-
您可以给每个实例一个随机 ID,并将其私有属性存储在某种数据结构中。但如果你使用构造函数,我建议你忘记私有属性。 JavaScript 不是为此而构建的,任何解决方法都有一些缺点。
-
@FelixKling 假设我们有一个辅助 DS,例如 {id1: { list:[3,4],currentIndex:2}, id2: { list:[2,1,4], currentIndex:3} } ... 即使在 MyStack.prototype.insert = function(val){ currState = this.auxiliaryDS[this.id]; this.currState.list.push(val).. 同样,它并不是真正的私有。
-
您可以在函数内部定义数据存储和构造函数,并且只公开构造函数。然后,数据存储将是私有的,无法从外部访问。是的,该 ID 可以访问,但如果您想对其进行混淆,您甚至可以为此生成一个随机属性名称。正如我所说的,JS 不是为此而构建的,你所做的任何事情都会变得笨拙和/或复杂。适当的文件是更有价值的国际海事组织。你可以在这里找到很多相关的问题:stackoverflow.com/…
-
@FelixKling 谢谢。我明白你的意思,尽管考虑到 JS 的灵活性,当你说“JS 不是为此而构建的”时,我不得不说这是一个很大的声明。 !
-
这里没有太多的答案。但是,在不至于荒谬的情况下,您可以将可公开访问的方法包装在原型中......或者,您可以将一组单一的辅助函数包装在第二个外部闭包中,该外部闭包包装您的预期构造函数(“静态”,私有函数)。从那里您可以公开一个命令类型的接口,该接口处理运行内部功能,以及在需要时使用私钥/索引注册单个实例。你永远不会使用 Prototype,但你会通过共享助手来节省内存,但会花费更多的时钟。
标签: javascript jquery oop design-patterns object