Javascript Set:Get 没意义?

Javascript Set:Get Pointless?

我一直在尝试使用以下模式的 getter 和 setter:

var mytab = {
  _tab: undefined,
  get: function () {
    return this._tab;
  },
  set: function (tab) {
    this._tab = tab;
    return tab;
  }
}

我的问题是,鉴于您必须显式访问这些方法,即:

mytab.get();
mytab.set('thistab');

为什么还要 getset?为什么不随心所欲地称呼他们呢?即:

var mytab = {
  _tab: undefined,
  getthetab: function () {
    return this._tab;
  },
  setthetab: function (tab) {
    this._tab = tab;
    return tab;
  }
}

我可能在这里遗漏了一些基本原则,但这两个 objects 的行为完全相同。

我假设有特殊的 'setters' 和 'getters' 将允许使用它的对象名称修改对象,即:

var a = mytab;
mytab = 'thistab';

甚至:

var a = mytab();
mytab() = 'thistab';

这是我所期望的,也是我想要的,但是这些指令给出了错误,即 mytab() 不是函数。

我希望能够澄清 setget 对象方法实际具有的特殊意义。

以下用例可以说明使用 getters 和 setter

的优势

var person = {
  firstName: "John",
  lastName: "Doe",
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
};
console.log(person.fullName);

使用 getter 我们可以像 属性 一样使用 get fullName,而不需要维护单独的字段。

在您的第一个示例中,您还没有声明getters/setters。您创建了一个对象,其中包含两个方法 getset.

要声明 getters/setters,您必须选择一个任意名称,并使用 getset 作为 前缀 ,例如:

var mytab = {
  _tab: undefined,
  get tab() {
    return this._tab;
  },
  set tab(tab) {
    this._tab = tab;
    return tab;
  }
}

在这种情况下,它们形成一个 so-called 访问器 属性,具有所选名称:

console.log(mytab.get) //undefined
console.log(mytab.set) //undefined

mytab.tab = 'foo'
console.log(mytab._tab) //foo
mytab._tab = 'bar'
console.log(mytab.tab) //bar
console.log(Object.getOwnPropertyDescriptor(mytab, 'tab')) /*
{
  get: function(){...},
  set: function(tab){...},
  ...
}
*/

但是,您不能重载运算符或以其他方式为您的对象定义 单个 getter/setter 对,这样您就可以从对象本身。

您只能为对象的属性定义 getters/setters。

所以,

var a = mytab

mytab = a

无法被拦截,并且没有按照您的预期进行(第一个将对象本身分配给另一个变量(a),而第二个将变量 mytab 的值重新分配给a 甚至不影响对象/与对象交互)。