在构造函数中定义 get/set

Define get/set in constructor function

可以这样做:

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

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

您可以将这两种想法与 Object.assign 结合起来:

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

但是请确保始终如一地引用 _foo,而不是 this._foo,因为您从未定义过它。

或者,使用 ES6 class 表示法,您可以这样做——在这里我将值存储在 this._foo:

class Something {
    constructor(defaultFoo) {
        this._foo = defaultFoo;
    }
    get Foo() { return this._foo; }
    set Foo(value) { this._foo = value; }
}

您可以使用原型 属性 并分配 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);