在构造函数中定义get/set的含义

9
这可以做到:
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);

那个语法是无效的。有没有一些变体可以使用?

2个回答

9

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


6
您可以使用Object.assign结合两种思路:
function Something(defaultFoo) {
  var _foo = defaultFoo;
  Object.assign(this, {
      get Foo() { return _foo; },
      set Foo(value) { _foo = value; }
  });
}

请确保始终像这样引用_foo,而不是this._foo,因为你从未定义过它。
另外,使用ES6类符号可以这样做——在这里我将值存储在this._foo中:
class Something {
    constructor(defaultFoo) {
        this._foo = defaultFoo;
    }
    get Foo() { return this._foo; }
    set Foo(value) { this._foo = value; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接