【问题标题】:how to define setter and getter in a class in javascript in GAS如何在 GAS 中的 javascript 类中定义 setter 和 getter
【发布时间】:2020-04-27 16:22:40
【问题描述】:

我正在研究使用 ES5 javascript 的 GAS(Google Apps 脚本)。

我定义了一个类如下:

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

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

然后,我想以与定义 Test.prototype.doSomething 相同的方式为 this._a 添加 setter 和 getter。

我发现这段代码在this link中定义了setter和getter:

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

但是,我不知道如何将这种方式应用到我的案例中。

你能告诉我怎么做吗?提前致谢。

【问题讨论】:

    标签: javascript google-apps-script


    【解决方案1】:

    Google Apps 脚本是 JavaScript 的一种有趣的方言,因为它已经非常过时(尽管我知道这将得到修复),但其中包含一些奇怪的现代事物。

    有几种较旧的方法可以做您想做的事情,希望其中一种适用于 GAS:

    Object.defineProperty

    这仍然是现代的,但是很久以前添加的 GAS 可能有它:使用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
    });
    

    使用getset 语法

    ...定义gettersetter,如问题中的示例所示。

    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 属性(默认情况下,它在您自动获取的对象中以这种方式定义,但是如果你替换它,自然不会在替换时自动提供它。

    真正的老路

    我怀疑 GAS 是否支持它,但以防万一,真的旧方法使用 __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 的一部分,但多年来它一直是 Mozilla 的 JavaScript 方言(为了向后兼容性,可能仍然如此)。

    【讨论】:

    • 嗨.. GAS 在一两个月前更新到 v8。有关详细信息,请参阅tag info page。但是 op 可能仍在使用旧引擎。所以,我认为这很有用
    • 是的,我知道“使用 get 和 set 语法”的方式,但正如您所解释的,我不希望它完全替换原型属性上的对象。所以,我应用“Object.defineProperty”的方式。非常感谢!
    • @TheMaster 感谢您的建议。是的,我知道 v8 更新。但它有一些问题,所以我因为这个问题而推迟了使用 v8:issuetracker.google.com/issues/149413841
    • @TheMaster - 谢谢!我听说它正在开发中,我很高兴听到它已经开始了!
    • @Herbert - defineProperty 工作了吗?很高兴知道。我大约有 75% 的想法是…… :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多