为什么在JavaScript中使用getter和setter?

为什么在JavaScript中使用getter和setter?,javascript,getter-setter,Javascript,Getter Setter,我知道getter和setter在JavaScript中是如何工作的。我不明白的是,当我们可以使用正规函数得到相同的结果时,为什么我们需要它们?考虑下面的代码: var person = { firstName: 'Jimmy', lastName: 'Smith', get fullName() { return this.firstName + ' ' + this.lastName; } } console.log(person.fullN

我知道getter和setter在JavaScript中是如何工作的。我不明白的是,当我们可以使用正规函数得到相同的结果时,为什么我们需要它们?考虑下面的代码:

var person = {
    firstName: 'Jimmy',
    lastName: 'Smith',
    get fullName() {
        return this.firstName + ' ' + this.lastName;
    }
}

console.log(person.fullName);    // Jimmy Smith
我们可以很容易地用一个函数替换getter:

var person = {
    firstName: 'Jimmy',
    lastName: 'Smith',
    fullName: function() {
        return this.firstName + ' ' + this.lastName;
    }
}

console.log(person.fullName());    // Jimmy Smith

我看不出编写getter和setter的意义。

使用getter或setter与使用标准函数的区别在于,getter/setter在赋值时自动调用。因此,它看起来就像一个普通属性,但在幕后,您可以在赋值之前或之后运行额外的逻辑(或检查)

因此,如果您决定将这种额外的逻辑添加到已经被引用的一个现有对象属性中,您可以将其转换为getter/setter样式,而无需更改具有该属性访问权限的其余代码

编辑:下面是一个额外逻辑的示例,该类计算其名称被读取的次数:

class-MyClass{
构造函数(){
this.refCount=0;
这个._name='类';
}
获取名称(){
这个.refCount++;
log(`name被读取${this.refCount}次。`);
返回此。\u名称;
}
}
const myClass=new myClass();
设maxMessages=5;
常数t=setInterval(()=>{
log(`name:${myClass.name}`);
如果(--maxMessages<1){
console.log('done');
净间隔(t);
}

}, 1000);我认为这只是一个“风格”问题,因为你不“需要”使用它们,你“可以”使用它们,如果你愿意的话,它可以让代码更具可读性:
foo.status='inactive'
foo.setStatus('inactive')
…这不是一个基于观点的问题。它是完全有效的,并且与私有变量的可访问性有关。我正要提供一个完全有效的答案。@Inkdot问题是为什么要使用
.foo
而不是
.getFoo()
/
.setFoo()
;它们都实现了相同的WRT封装。问题是为什么使用setter要比使用setter好一点……这个问题与您所理解的略有不同,增加了第二段来阐明它的好处。假设您从一开始就在设计一个使用getter/setter的接口,而不是对其进行改造……那么您的答案是什么?不,不是。我是说我今天正在写一个新的对象,它还没有任何引用,我选择写
get foo()
/
set foo()
,而不是
getFoo()
/
setFoo()
…为什么我会这样做?你不能在getFoo,setFoo中使用像myObj.foo='some data'这样的赋值。您始终需要调用这些函数。如果您以后改变主意,比如说添加额外的逻辑,您需要将所有引用转换为函数调用。