小编典典

如何在原型上定义setter / getter

javascript

EDIT
:请注意,此问题是在2012年提出的。每个月左右,有人会添加一个新的答案或评论来驳斥该答案,但这样做实际上没有任何意义,因为该问题可能已经过时了(请记住,是GnomeJavascript编写gnome-shell扩展,而不是浏览器的东西,这是相当具体的)。

继我先前关于如何在Java中进行子类化的问题之后,我正在制作一个超类的子类,如下所示:

function inherits(Child,Parent) {
    var Tmp = function {};
    Tmp.prototype = Parent.prototype;
    Child.prototype = new Tmp();
    Child.prototype.constructor = Child;
}
/* Define subclass */
function Subclass() {
    Superclass.apply(this,arguments);
    /* other initialisation */
}
/* Set up inheritance */
inherits(Subclass,Superclass);
/* Add other methods */
Subclass.prototype.method1 = function ... // and so on.

我的问题是, 如何使用这种语法在原型上定义一个setter / getter?

我曾经做过:

Subclass.prototype = {
    __proto__: Superclass.prototype,
    /* other methods here ... */

    get myProperty() {
        // code.
    }
}

但是很明显,以下操作无效:

Subclass.prototype.get myProperty() { /* code */ }

我使用的是GJS(GNOME Javascript),该引擎与MozillaSpidermonkey差不多。我的代码不适合浏览器使用,只要它受GJS支持(我想这意味着Spidermonkey?),我就不在乎它是否不兼容。


阅读 346

收藏
2020-05-01

共1个答案

小编典典

使用对象文字声明(最简单的方法):

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

使用Object.defineProperty(在支持ES5的现代浏览器上):

Object.defineProperty(o, "myProperty", {
    get: function myProperty() {
        // code
    }
});

或使用__defineGetter____defineSetter__(已 弃用 ):

var d = Date.prototype;
d.__defineGetter__("year", function() { return this.getFullYear(); });
d.__defineSetter__("year", function(y) { this.setFullYear(y); });
2020-05-01