我不确定我是否做得对。
这个例子直接来自MDN(Mozilla Developer Network):
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
会发生什么 - 它会创建一个名为bValue的全局变量,但未完成。我知道这个例子只展示了它的使用,因此它可以创建一个全局变量。但是如果我要在应用程序中使用它,我会稍微修改一下,添加this
关键字:
Object.defineProperty(o, "b", {get : function(){ return this.bValue; },
set : function(newValue){ this.bValue = newValue; },
enumerable : true,
configurable : true});
现在,对象o
将具有属性b
,同时,它还将具有另一个属性bValue
。用户(程序员)将仅暴露于'b'而不是'bValue',尽管他仍然可以直接访问bValue - 我看不出它是如何被阻止的。
我理解属性b
和属性bValue
可能并不总是相同,但b
取决于bValue
的值,因为getter和setter允许我们在将值赋给b
之前预先处理bValue。
主要问题是,我做对了吗?或者我在这里遗漏了什么?
答案 0 :(得分:6)
您似乎在寻找闭包。这是一种编码模式,使您可以使用私有变量,只显示您想要公开的内容(公共变量)。
(function() {
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
})();
它创建一个函数并立即执行它。这似乎没用,但由于函数引入了一个范围的级别,bValue
在任何地方都无法访问,只能在函数内部访问。
o.b
属性充当开发人员和值之间的委托。您无法访问bValue
本身。 (虽然在这个例子中,getter / setter显然会使他们完全与直接使用bValue
一样。)
答案 1 :(得分:3)
我的想法是将代码包装在一个闭包中,从而将bValue
隐藏在世界之外,如下所示:
var o =(function() {
var o={},bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
return o;
})();
现在您可以引用o.b
但不能引用bValue