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?),我就不在乎它是否不兼容。
使用对象文字声明(最简单的方法):
var o = { a: 7, get b() { return this.a + 1; }, set c(x) { this.a = x / 2 } };
使用Object.defineProperty(在支持ES5的现代浏览器上):
Object.defineProperty
Object.defineProperty(o, "myProperty", { get: function myProperty() { // code } });
或使用__defineGetter__和__defineSetter__(已 弃用 ):
__defineGetter__
__defineSetter__
var d = Date.prototype; d.__defineGetter__("year", function() { return this.getFullYear(); }); d.__defineSetter__("year", function(y) { this.setFullYear(y); });