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
});
使用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 属性(默认情况下,它在您自动获取的对象中以这种方式定义,但是如果你替换它,自然不会在替换时自动提供它。
真正的老路
我怀疑 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 方言(为了向后兼容性,可能仍然如此)。