Javascript 闭包 vs Object.createProperty

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

我必须承认,这两种方法都比传统的面向对象编程语言更复杂,但第二种方法是否更加自然呢? 那么为什么闭包如此受欢迎,它们还有哪些优点,使用闭包创建对象和我刚才描述的方式有什么区别?


3
可写属性和私有属性是完全不同的概念。你正在拿苹果和橙子进行比较。 - millimoose
@pure_code 好的,那肯定是差异的一部分,我忽略了这一点! - Joel Blum
2个回答

1

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

使用 defineProperty 定义可枚举、可写和可配置的数据属性的示例可以(并且应该)通过默认属性赋值缩写(在旧版浏览器中也适用):

o.a = 37;

并非所有对象都需要使用闭包创建(在您的示例中我想不到任何应用场景),但您可能想要学习JavaScript 闭包如何工作?


0

这是一个语法偏好和浏览器兼容性问题。一个非常重要的陷阱是,如果你想要兼容各种浏览器的代码,defineProperty 方法对于非 DOM 对象只在 IE 9+ 版本可用。

就语法而言,你会发现使用 defineProperty 会失去一些我所谓的“视觉封装”效果。

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

注意:

  • 我假设你通过将可写属性设置为 false 来实现私有成员。

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接