Javascript集:变得毫无意义?
我一直在尝试以下模式的getter和setter: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呢?
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