3

我的问题如下: 在我阅读的关于闭包的大多数或所有教程中,它们的首要资产被描述为它们能够定义私有成员。例如,来自神话般的 nettuts 网站:http ://net.tutsplus.com/tutorials/javascript-ajax/digging-into-design-patterns-in-javascript/ 。我的问题如下 - 当您可以使用 Object.definteProperty 时,为什么您会选择使用闭包创建对象,但语法有些不自然?例如

var o = {}; // Creates a new object

 // Example of an object property added with defineProperty with a data property descriptor
Object.defineProperty(o, "a", {value : 37,
                           writable : false,
                           enumerable : true,
                           configurable : true});
 // 'a' property exists in the o object and its value is 37

我必须承认这两种方式都比传统的 OOP 语言长得多,但第二种方式不是更自然吗?那么为什么闭包如此受欢迎,它们还有哪些其他资产以及使用闭包或我刚才描述的方式创建对象之间有什么区别?

4

2 回答 2

1

Object.defineProperty仍然定义公共属性,而闭包允许隐私(你不应该谈论私有“成员”,它只是局部变量)。

您的示例,defineProperty用于定义可枚举、可写和可配置的数据属性可以(并且应该)由默认属性分配缩写(也适用于旧浏览器):

o.a = 37;

并非所有对象都需要使用闭包创建(在您的示例中,我想不出任何应用程序),但您可能想了解JavaScript 闭包是如何工作的?.

于 2013-02-17T14:53:33.850 回答
0

这是语法偏好和浏览器兼容性的问题。一个大问题是,如果您想要浏览器兼容的代码,该defineProperty方法仅在 IE 9+ 中适用于非 dom 对象。

就语法而言,您可以看到在使用defineProperty.

每种方式都有自己的好处,但都缺乏更直接支持隐私的语言的简单性。

笔记:

  • 我假设私人是指您将可写属性设置为false。

参考

于 2013-02-17T14:53:24.967 回答