getter 和 setter 之间有什么区别?我的意思是,如果我互换使用它们是错误的吗?

What is the difference between getters and setters? I mean, is it a mistake if I use them interchangeably?

例如在w3school.com有这样一段代码:

// Define object
var obj = {counter : 0};

// Define setters
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (value) {this.counter -= value;}
});

// Play with the counter:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;

他们使用吸气剂。我用 setter 和 运行 替换了 getters 相同的代码,它 运行 完全一样。所以我有两个问题:

  1. 他们为什么要在这里使用“get”?
  2. 在使用 getter 和 setter 时是否有传统上接受的方式(常规)?

不一样,如果访问一个属性就调用getter foo.bar,如果设置一个属性就调用setterfoo.bar='baz' 使用 = 运算符。

// Define object
var obj = {counter : 0};

// Define setters
Object.defineProperty(obj, "reset", {
  get : function () {console.log('get')},
  set : function (value) {console.log('set')}
});

// Play with the counter:
obj.reset;// "get"
obj.reset=2;// "set"

是的,您可以滥用吸气剂来完成 setter 的工作,但您应该遵守以下约定:

  1. set 在您使用赋值运算符 = 时激活。价值 赋值运算符右侧的将传递给 setter 作为参数,该参数的值应该赋值在某处。
  2. get 当你请求一个值时激活,一个值应该总是返回,即使它是 nullundefined.