我是 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 类更直观、更紧凑。没有构造函数、原型或过度使用“this”。您还可以获得必须显式声明本地字段的好处,而不是希望在构造函数中不要出现任何拼写错误。
EDIT
好吧,我就澄清一下。看来“阶级”这个词得到了一些支持。无论如何,对我来说,“类”是类型概念的扩展,JS 在这方面不合格,但我可以用我的书(Flanagan)花了 50 页调用类的内容来做各种类的事情。有点。
不管怎样,真正的问题是:我在我的第一个 Web 应用程序上使用 jQuery 选项卡。我昨天注意到这不起作用,因为我的 JS 代码没有为每个选项卡保留任何私有状态。当我在选项卡之间切换时,代码的动态/鼠标部分不再正常工作。
那么,将私有状态引入应用程序的最佳方式是什么?大多数代码是安全的,但处理动态行为的所有代码都需要某种方法来封装每个选项卡的本地状态。对于具有 C++ 背景的人来说,对我来说显而易见的答案是编写一个定义选项卡动态部分的类,并在每次创建选项卡时实例化一个新的“选项卡”对象。我发现很难理解的是 JS 伪类在这里是否真的有意义,或者我是否应该扩展上面的代码。
只需阅读 Jonathan 的模块模式链接,现在在我看来这可能就是答案。
Thanks.
避免关闭的原因是开销。
你的 get 和 set 函数比属性慢 20 倍。您的闭包还具有很大的内存开销,随着实例数量的增加,内存开销为 O(N)。
另请注意,这些封装变量的实际好处为零,它们只是推断性能损失。
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);
我昨天注意到这不起作用,因为我的 JS 代码没有为每个选项卡保留任何私有状态。
你的问题不是你没有私有状态,而是你正在使用全局状态。
简单的解决方案是每个选项卡都有一个对象(或者如果您愿意,可以有一个“结构”)并在其中存储状态。
所以你所要做的就是定义一个选项卡
var Tab = {
constructor: function (...) {
/* init state */
},
doTabStuff: function () { /* some method */ },
...
}
然后在需要时创建新选项卡
var tab = Object.create(Tab).constructor(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)