当前位置: 首页 > 面试题库 >

如何在原型上定义setter / getter

微生良策
2023-03-14
问题内容

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(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); });


 类似资料:
  • 问题内容: 以下两个JavaScript原型之间的功能区别是什么?选择一个与另一个原型有什么好处? 选项1: 选项2: 我是否假设 选项2 导致废弃某些隐式绑定到原型的函数是否正确? 问题答案: 我是否假设选项2导致废弃某些隐式绑定到原型的函数是否正确? 对,就是这样。尽管唯一隐式绑定的属性是您很少需要的属性。 功能上有什么区别? 选项1只是扩展现有的原型。如果已经有从原型对象继承的实例,则它们也

  • 问题内容: 我解析了.yaml文件,需要以自定义方式解组其属性之一。我正在使用包裹。 有问题的属性按如下方式存储在我的.yaml文件中: 因此,它基本上是一种类型。 但是我需要在哪里定义为: 我的结构: 我试图像这样实现Unmarshaler接口: 我的问题是在函数内部未定义类型,从而在运行时导致nil指针异常。 我如何在此处正确实现Unmarshaler接口? 问题答案: 由于@Volker并未

  • 我正在使用Scala 2.11.8并尝试添加protobuf。 这是我的日志: [信息]协议目标目录:/home/user/Git/tortle/target/src\u managed/main [信息]协议目标目录:/home/user/Git/tortle/target/src\u managed/main [...] [错误]/home/user/Git/tortle/target/src

  • 问题内容: 我通过添加来安装平台定义。但是,当我使用中的定义时,无法访问API的某些部分。例如,我无法访问 因为“ android.support”没有导出的成员“ design”,我想念什么?当我完成代码时,仅得到“ android.v4”,而v4不包含“设计”模块。 我也尝试 像有人建议的那样直接使用’app’对象导入: 有了上面的代码,我就完成了代码,但是在下面弯曲的红色和tsc不会编译。

  • 是否可以为基元类型定义招摇定义/模型?例如,考虑以下几点 但是,上面的示例返回了许多错误(例如,swagger需要一个字段)并且没有示例使用任何不是。 目的是将其用作另一个模型的子组件和参数——以某种方式重用已经定义的组件。 把这想象成一个昂首阔步的typedef 编辑:根据规范,定义对象与模式对象相同http://swagger.io/specification/#schemaObject,表示

  • 我试图创建一个自定义的原型,它定义了一个实质性的pom.xml并包含几个源文件。 在使用这个原型生成项目时,没有包含我在archetype.xml中定义的任何源(pom.xml按预期生成)。 batfile.bat位于src/main/resources/archetype-resources/src/main/resources中。 我还有一个原型-metadata.xml位于src/main/