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');
为什么还要 get
或 set
?为什么不随心所欲地称呼他们呢?即:
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()
不是函数。
我希望能够澄清 set
和 get
对象方法实际具有的特殊意义。
以下用例可以说明使用 getters 和 setter
的优势
var person = {
firstName: "John",
lastName: "Doe",
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
};
console.log(person.fullName);
使用 getter 我们可以像 属性 一样使用 get fullName,而不需要维护单独的字段。
在您的第一个示例中,您还没有声明getters/setters。您创建了一个对象,其中包含两个方法 get
和 set
.
要声明 getters/setters,您必须选择一个任意名称,并使用 get
或 set
作为 前缀 ,例如:
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
甚至不影响对象/与对象交互)。
我一直在尝试使用以下模式的 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;
}
}
我可能在这里遗漏了一些基本原则,但这两个 objects
的行为完全相同。
我假设有特殊的 'setters' 和 'getters' 将允许使用它的对象名称修改对象,即:
var a = mytab;
mytab = 'thistab';
甚至:
var a = mytab();
mytab() = 'thistab';
这是我所期望的,也是我想要的,但是这些指令给出了错误,即 mytab()
不是函数。
我希望能够澄清 set
和 get
对象方法实际具有的特殊意义。
以下用例可以说明使用 getters 和 setter
的优势var person = {
firstName: "John",
lastName: "Doe",
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
};
console.log(person.fullName);
使用 getter 我们可以像 属性 一样使用 get fullName,而不需要维护单独的字段。
在您的第一个示例中,您还没有声明getters/setters。您创建了一个对象,其中包含两个方法 get
和 set
.
要声明 getters/setters,您必须选择一个任意名称,并使用 get
或 set
作为 前缀 ,例如:
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
甚至不影响对象/与对象交互)。