我不确定我是否做对了。
该示例直接来自MDN(Mozilla开发人员网络):
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
。尽管用户(程序员)仍然可以直接访问bValue,但他只会看到“b”而不是“bValue”-我不知道如何避免这种情况。我知道属性
b
和属性bValue
可能并不总是相同,但是b
将取决于bValue
的值,因为getter和setter允许我们在将值赋给b
之前对bValue进行预处理。主要问题是,我做对了吗?还是我在这里想念什么?
最佳答案
您似乎正在寻找关闭方法。这是一种编码模式,使您可以使用私有(private)变量,并且仅公开要公开的内容(公共(public)变量)。
(function() {
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
})();
它创建一个函数并立即执行。这似乎没有用,但是由于函数引入了作用域范围,因此
bValue
在任何地方都无法访问,而是通过这种方式在函数内。o.b
属性充当开发人员和值之间的委托(delegate)。您无法访问bValue
本身。 (尽管在此示例中,getter / setter的行为显然使其与直接使用bValue
完全相同。)http://jsfiddle.net/W4CSE/2/