我不确定我是否做对了。

该示例直接来自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/

10-04 17:12