我是JS的新手(来自C++/etc),对我来说,闭包似乎是比类更简单,更方便的封装方法。这段代码似乎提供了一种处理封装的简单方法:
function addProperty(o) {
var value;
o["get"] = function() { return value; }
o["set"] = function(v) { value = v; }
}
// create two independent objects which are instances of pseudo-class 'addProperty',
// which each have their own version of a set of local fields, and methods that
// operate on those fields:
var a = {};
addProperty(a);
var b = {};
addProperty(b);
如果您只想让一个类处理封装(在C++中,我发现大多数时候都是这样),是否有充分的理由使用JS类而不是闭包?在我看来,以上代码比JS类更直观,更紧凑。没有构造函数,原型(prototype)或过多使用“this”。您还获得了必须显式声明局部字段的好处,而不是希望您不要在构造函数中进行任何输入错误。
编辑
好的,我只是澄清一下。似乎“类(Class)”一词得到了一些支持。无论如何,对我来说,“类”是类型概念的扩展,而JS在这方面没有资格,但是我可以用我的书(Flanagan)花50页调用类来做各种类Y的事情。有点。
无论如何,真正的问题是:我在第一个Web应用程序上使用jQuery选项卡。昨天我注意到这是行不通的,因为我的JS代码没有为每个选项卡保留任何私有(private)状态。当我在选项卡之间交换时,代码的动态/鼠标部分不再正常工作。
那么,将私有(private)状态引入应用程序的最佳方法是什么?大多数代码是安全的,但是处理动态行为的所有内容都需要某种方式来封装每个选项卡的本地状态。在C++背景下,对我来说,显而易见的答案是编写一个定义选项卡动态部分的类,并在每次创建选项卡时实例化一个新的“选项卡”对象。我发现很难理解的是JS伪类在这里是否真的有意义,或者我是否应该扩展上面的代码。
只需阅读Jonathan的模块模式链接,在我看来,这可能就是答案。
谢谢。
最佳答案
避免关闭的原因是开销。
您的get和set函数的速度比属性慢20倍。您的闭包还具有很大的内存开销,即实例数量为O(N)。
还请注意,这些封装的变量的实际 yield 为零,它们只是推断性能损失。
var AddProperty = {
constructor: function (v) { this._value = v; return this; },
get: function () { return this._value; },
set: function (v) { this._value = v; }
};
var a = Object.create(AddProperty).constructor(1);
var b = Object.create(AddProperty).constructor(2);
您的问题不是您没有私有(private)状态,而是您正在使用全局状态。
一种简单的解决方案是在每个选项卡上有一个对象(如果愿意,可以有一个“结构”)并在其中存储状态。
所以您要做的就是定义一个标签
var Tab = {
constructor: function (...) {
/* init state */
},
doTabStuff: function () { /* some method */ },
...
}
然后在需要时创建新选项卡
var tab = Object.create(Tab).constructor(...)