在构造函数中定义get/set

问题描述 投票:0回答:2

可以这样做:

var o = {
  _foo : "bar",
  get Foo() { return _foo; },
  set Foo(value) { _foo = value; }
};

但是我的代码是在构造函数中定义的,所以我想要这样的东西:

function Something(defaultFoo) {
  var _foo = defaultFoo;
  get Foo() { return _foo; };               // invalid syntax
  set Foo(value) { _foo = value; };         // invalid syntax
}

var something = new Something("bar");
console.log(something.Foo);

该语法无效。有一些有效的变体吗?

javascript getter-setter
2个回答
9
投票

您可以使用原型属性并分配 setter 和 getter。

顺便说一句,您需要使用

_foo
作为属性,而不是局部变量。

function Something(defaultFoo) {
    this._foo = defaultFoo;
}

Object.defineProperty(Something.prototype, 'foo', {
    get: function() {
        return this._foo;
    },
    set: function(value) {
        this._foo = value;
    }
});

var something = new Something("bar");
console.log(something.foo);
something.foo = 'baz';
console.log(something.foo);


7
投票

您可以将这两种想法与

Object.defineProperty
结合起来:

function Something(defaultFoo) {
    var _foo = defaultFoo;
    Object.defineProperty(this, "Foo", {
        get: function() { return _foo },
        set: function(value) { _foo = value }
    });
}

但是请确保始终如一地引用

_foo
,而不是
this._foo
,因为你从未定义过它。

或者,使用 ES6 类表示法(以及自 ES2020 以来添加的私有字段),您可以执行此操作 - 在这里,我将值存储在私有

#foo
字段中:

class Something {
    #foo
    constructor(defaultFoo) {
        this.#foo = defaultFoo;
    }
    get Foo() { return this.#foo; }
    set Foo(value) { this.#foo = value; }
}
© www.soinside.com 2019 - 2024. All rights reserved.