【发布时间】:2012-02-02 12:32:29
【问题描述】:
我是 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”。您还可以获得必须显式声明本地字段的好处,而不是希望您不要在构造函数中输入任何拼写错误。
编辑
好的,我会澄清一下。似乎“类”这个词得到了一些支持。无论如何,对我来说,“类”是类型概念的扩展,而 JS 在这方面不符合条件,但我可以用我的书 (Flanagan) 花费 50 页调用类的内容来做各种类的事情。有点像。
无论如何,真正的问题是:我在我的第一个 Web 应用程序上使用 jQuery 选项卡。我昨天注意到这不起作用,因为我的 JS 代码没有为每个选项卡保留任何私有状态。当我在选项卡之间切换时,我的代码的动态/鼠标部分不再正常工作。
那么,将私有状态引入应用的最佳方式是什么?大多数代码是安全的,但处理动态行为的所有内容都需要某种方式来封装每个选项卡的本地状态。对于 C++ 背景,对我来说显而易见的答案是编写一个定义选项卡动态部分的类,并在每次创建选项卡时实例化一个新的“选项卡”对象。我发现很难理解的是 JS 伪类在这里是否真的有意义,或者我是否应该扩展上面的代码。
只需阅读 Jonathan 的模块模式链接,现在在我看来这可能就是答案。
谢谢。
【问题讨论】:
-
没有 JavaScript 类这样的东西。要么这样,要么在过去的 6 年里我一直做错了。
-
恕我直言,这是语义。它们在代码中可能不称为类,但出于所有实际目的,您可以声明类并将它们实例化为对象。
-
好的 - (a) 闭包和 (b) “包括原型、构造函数和继承在内的一组语言构造的相对优点如何,它们在其他语言中的用途包括对象的封装以及对这些对象进行操作的方法”,作为 JavaScript 中的通用封装机制?
标签: javascript class closures