簡體   English   中英

私有財產的通用設置器/獲取器方法

[英]General setter/getter methods for private properties

我可以在JavaScript類上創建私有成員,如下所示:

function Class(_foo, _bar) {
    var foo = _foo, // private, yay
        bar = _bar; // also private, also yay
}

如何為此類實現通用的setter / getter方法? 我想一種方法是使用eval

function Class(_foo, _bar) {
    var foo = _foo,
        bar = _bar;

    this.get = function(property) {
        return eval(property);
    };

    this.set = function(property, value) {
        eval(property + " = " + value);
    };
}

但是,這種解決方案很難看。 另一種方法是創建一個private對象,然后訪問該對象的屬性:

function Class(foo, bar) {
    var private = {
        foo: foo,
        bar: bar 
    };

    this.get = function(property) {
        return private[property];
    };

    this.set = function(property, value) {
        private[property] = value;
    };
}

不過,我也不太喜歡這種解決方案,因為這意味着我必須到處訪問private對象。 當然,有一種更干凈的方法可以為JavaScript類的私有屬性提供通用的getter / setter方法?

我知道已經問過類似的問題,但似乎沒有一個人問這個特定問題。 也就是說,如何為類中的所有私有屬性提供單個獲取器/設置器。

這是帶有兩個示例的jsFiddle

我認為您應該查看ES5的getter和setter。 這些允許您創建看起來像屬性的東西,但實際上是在它們后面調用函數。 例如:

var _a : 'nuthin',
var obj = {
  get a: function() { return this._a; },
  set a: function(a) { this._a = a; }
}

obj.a = 'sumpin';
console.log(obj.a); // nuthin

您也可以在構造函數內部創建getter和setter,但是語法比較笨拙。 像這樣:

function nooObject(){
  var _a = 'nuthin';
  Object.defineProperties(this, {
    "a": { get: function () { return _a; } 
           set: function(a) { this._a = a; } }
  });
}

使用Object.defineProperties可以做更多的事情。 閱讀有關MDN的所有信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM