как определить сеттер и геттер в классе в javascript в ГАЗ - PullRequest
2 голосов
/ 27 апреля 2020

Я работаю над GAS (Google Apps Script), где я использую ES5 javascript.

Я определил класс следующим образом:

var Test = function(a){
  this._a = a;
}

Test.prototype.doSomething = function(){
  //do something here
}

И затем я хочу добавить setter и getter для this._a точно так же, как определены Test.prototype.doSomething.

Я нашел этот код для определения сеттера и геттера в этой ссылке :

var o = {
    a: 7,
    get b() {
        return this.a + 1;
    },
    set c(x) {
        this.a = x / 2
    }
};

Однако я не знаю, как применить этот способ к моему делу.

Подскажите, пожалуйста, как? Заранее спасибо.

1 Ответ

4 голосов
/ 27 апреля 2020

Google Apps Script - это интересный диалект JavaScript, поскольку он очень устарел (хотя я понимаю, что это будет исправлено), и в то же время содержит в себе странное знание современных вещей.

Есть несколько старых способов сделать то, что вы пытаетесь сделать, надеюсь, один из них работает в GAS:

Object.defineProperty

Это все еще современный, но был добавлен долго достаточно, чтобы go ГАЗ мог иметь его: Используя Object.defineProperty, например:

var Test = function(a){
    this._a = a;
};

Test.prototype.doSomething = function(){
    //do something here
};

Object.defineProperty(Test.prototype, "a", {
    get: function() {
        return this._a;
    },
    set: function(value) {
        this._a = value;
    },
    configurable: true
});

Используя get и set Синтаксис

.. . чтобы определить getter и setter , как в вашем примере в вопросе.

var Test = function(a){
    this._a = a;
};

Test.prototype = {
    constructor: Test,
    doSomething: function(){
      //do something here
    },
    get a() {
        return this._a;
    },
    set a(value) {
        this._a = a;
    }
};

Обратите внимание, что при полной замене объекта на prototype свойство вроде этого, вы хотите быть уверены, что определите свойство constructor, как показано выше (оно определяется таким образом по умолчанию в объекте, который вы получаете автоматически, но если вы его заменяете, естественно, оно не предоставляется автоматически при замене).

ДЕЙСТВИТЕЛЬНО Старый Путь

Я сомневаюсь, что ГАЗ поддерживает это, но на всякий случай, действительно старый способ сделать это использует __defineGetter__ и __defineSetter__ как это:

var Test = function(a){
    this._a = a;
};

Test.prototype.doSomething = function(){
    //do something here
};

Test.prototype.__defineGetter__("a", function() {
    return this._a;
});
Test.prototype.__defineSetter__("a", function(value) {
    this._a = value;
});

Это никогда официально не было частью ECMAScript, но это было на диалекте JavaScript от Mozilla в течение многих лет (и, вероятно, все еще для обратной совместимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...