Javascript集:变得毫无意义?

Javascript集:变得毫无意义?,javascript,getter-setter,Javascript,Getter Setter,我一直在尝试以下模式的getter和setter: var mytab = { _tab: undefined, get: function () { return this._tab; }, set: function (tab) { this._tab = tab; return tab; } } 我的问题是,如果您必须显式访问这些方法,即: mytab.get(); mytab.set('thistab'); 为什么要费心让get或set呢?

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

var mytab = {
  _tab: undefined,
  get: function () {
    return this._tab;
  },
  set: function (tab) {
    this._tab = tab;
    return tab;
  }
}
我的问题是,如果您必须显式访问这些方法,即:

mytab.get();
mytab.set('thistab');
为什么要费心让
get
set
呢?为什么不叫他们你喜欢的名字呢?即:

var mytab = {
  _tab: undefined,
  getthetab: function () {
    return this._tab;
  },
  setthetab: function (tab) {
    this._tab = tab;
    return tab;
  }
}
我可能在这里遗漏了一些基本原则,但这两个
对象的行为完全相同

我假设使用特殊的“setter”和“getter”将允许使用对象名修改对象,即:

var a = mytab;
mytab = 'thistab';
甚至:

var a = mytab();
mytab() = 'thistab';
这是我所期望的,也是我想要的,但是这些指令给出了错误,即
mytab()
不是一个函数


我希望能够澄清
set
get
对象方法实际上有什么特殊意义。

下面的用例可以说明使用getter和setter的优势

var-person={
名字:“约翰”,
姓:“Doe”,
获取全名(){
返回`${this.firstName}${this.lastName}`;
}
};

console.log(person.fullName)在第一个示例中,没有声明getter/setter。您已经使用两种方法创建了一个对象,分别称为
get
set

要声明getter/setter,您必须选择任意名称,并使用
get
set
前缀,例如:

var mytab={
_选项卡:未定义,
获取选项卡(){
返回此。\u选项卡;
},
设置选项卡(选项卡){
这个._tab=tab;
返回选项卡;
}
}
在本例中,它们形成了一个所谓的访问器属性,该属性具有选定的名称:

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对,这将允许您分配值或从对象本身读取值

您只能为对象上的属性定义getter/setter

所以


无法被截获,并且不执行您期望的操作(第一个将对象本身分配给另一个变量(
a
),而第二个将变量
mytab
的值重新分配为
a
,甚至不会影响对象或与对象交互)。

getter和setter不用于调用get()和set()方法。当然,但问题是为什么要这样做?@NiettheDarkAbsol因为这样,每当您从该属性(get)读取或分配到该属性(set)时,这些函数都会执行,所以Javascript中的getter/setter是拦截器方法。这实际上是一种比Java更好的实现getter/setter的方法。我的印象是,对象可以使用此方法委派其值,但我现在意识到此类方法仅适用于成员元素。我将把变量重命名为
options
或其他有用的名称,并将
tab
作为带有get:set函数的子元素。非常感谢。
var a = mytab
mytab = a