Javascript Closures vs Object.createProperty

时间:2013-02-17 14:47:29

标签: javascript closures

我的问题如下:在我阅读关于闭包的大多数或所有教程中,他们的第一个和最重要的资产被描述为他们能够定义私人成员。例如,来自神话般的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语言长得多,但第二种方式不是更自然吗? 那么为什么闭包如此受欢迎,它们有什么其他资产以及用闭包创建一个对象或者我刚刚描述的方式之间的区别是什么?

2 个答案:

答案 0 :(得分:1)

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

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

o.a = 37;

并非所有对象都需要使用闭包创建(在您的示例中我无法想到任何应用程序),但您可能想要学习How do JavaScript closures work?

答案 1 :(得分:0)

这是语法首选项和浏览器兼容性的问题。一个很大的问题是,如果您想要与浏览器兼容的代码,defineProperty方法仅适用于非dom对象的IE 9+。

就语法而言,你可以看到在使用defineProperty时你松了一点我称之为“视觉封装”的东西。

每种方式都有其自身的优点,但两者都缺乏更直接支持隐私的语言的简单性。

注意:

  • 我假设priavate你的意思是你将可写属性设置为false。

<强>参考