我对ECMAScript 6类中的getters和setters的意义感到困惑。目的是什么?下面是我引用的一个例子:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
发布于 2015-01-30 02:54:57
这些setter和getter允许您直接使用属性(不使用括号)
var emp = new Employee("TruMan1");
if (emp.name) {
// uses the get method in the background
}
emp.name = "New name"; // uses the setter in the background
这只是为了设置和获取属性的值。
发布于 2020-04-23 12:04:13
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
// when you get this by employeeInstance.name
// the code below will be triggered
// and you can do some logic here
// just like `console.log` something you want
console.log('get triggered!')
return this._name.toUpperCase();
}
set name(newName) {
// the same as `get`
// when you employeeInstance.mame = 'xxx'
// the code below will be trigged
// and you can also do some logic
// like here is a `console.log` and `if check`
console.log('set triggered!')
if (newName) {
this._name = newName;
}
}
}
const employeeInstance = new Employee('mike')
employeeInstance.name
employeeInstance.name = '' // this won't be successful, because the `if check`
console.log(employeeInstance.name)
// =>
// get triggered
// set triggered
// get triggered
// MIKE
无论如何,getter
和setter
就像一个间谍。每次获取或设置属性值时,它都会侦测对象的属性,以便您可以执行某些操作。
发布于 2018-01-05 23:59:26
Java和setter的动机与ES6中的类似概念有本质上的不同。
在Java语言中,getter和setter允许类定义JavaBean。getters和setter的要点在于,它允许bean具有与公共字段隐含的接口完全正交的“接口”。所以我可以有一个不是JavaBean属性的字段"name“,也可以有一个不是字段的JavaBean属性"address”。
通过JavaBean反射,成千上万的框架(例如Hibernate)也可以“发现”Java属性。因此,getter和setter是用于“公开”bean属性的标准方法的一部分。
作为函数的Getters和setter还具有“抽象”实现的价值。它既可以是一个字段,也可以是一个计算(“合成”)值。因此,如果我有一个名为"zipcode“的bean属性,它将以存储字符串的形式开始。现在假设我想将其更改为根据地址/城市/州计算的值?
如果我使用了一个字段,下面的代码就会中断:
String zipcode = address.zipcode();
但是如果我使用getter,这不会中断:
String zipcode = address.getZipcode();
JavaScript没有任何像JavaBeans这样的东西。据我所知,GET和SET的预期值仅限于前面提到的“合成”(计算)属性。
但它比java更好,因为Java不允许你兼容地将“字段”转换成方法,而ES6 GET和SET允许这样做。
也就是说,如果我有:
var zipcode = address.zipcode;
如果我将zipcode从标准对象属性更改为getter,上述代码现在将调用GET函数。
注意,如果我没有在定义中包含GET,这将不会调用zipcode GET方法。相反,它只会将函数zipcode赋值给var。
所以我认为这些是理解Java和JavaScript ES6的getter和setter之间的一些重要区别。
https://stackoverflow.com/questions/28222276
复制相似问题