javascript js如何区分getter和setter

nvbavucw  于 2023-01-04  发布在  Java
关注(0)|答案(3)|浏览(126)

例如,我有以下内容:

var o = {
  get path() {
    return _path;
  }
  set path() {
    _path=p;
  }
}

就像这样称呼它:

o.path // getter is called
o.path = 4 // setter is called

js如何知道在每种情况下调用哪个函数?

woobm2wo

woobm2wo1#

这与它知道你是在阅读属性还是在写属性时没有显式赋值getter或setting的方法是一样的,它查看是否有赋值运算符。

wkftcu5l

wkftcu5l2#

每次Javascript试图为属性赋值或获取值时,它都会尝试解析引用,检查引用是否为对象属性,最后检查引用是否为accessorDescriptor
访问器属性说明符是包含任何名为GetSet的字段的属性说明符

  • Get不要与对象的内部操作Get(P)混淆 *

setter不仅可以用赋值运算符调用:

var num = 0;
var o = {
  get myNum() {
      return num;
    },
    set myNum(n) {
      num = n;
    }
}

o.myNum++;
console.log(o.myNum);

var arr = [];

var o2 = {
  get prop() {
      return arr;
    },
    set prop(p) {
      arr.push(p);
    }
}

var o3 = {
  a: 'a',
  b: 'b',
  c: 'c',
  d: 'd'
}

for (o2.prop in o3) {

}

console.log(o2.prop);

GetSet对象内部操作主要处理isAccessorDescriptor逻辑,尽管也有某些其他抽象操作可以执行这些检查。
在规范中有很多地方调用了Get(P)和Set(P,V),尽管你可能想检查GetValuePutValue。如果你试图向对象属性中输入值或从对象属性中获取值,它会检查它是否有accessorDescriptor,并调用它各自的函数,这会更容易记住。

mu0hgdu0

mu0hgdu03#

来自文档(setget):
设置器:

必须只有一个参数(参见不兼容ES 5更改:文字getter和setter函数现在必须正好具有零个或一个参数以获得更多信息);

吸气剂:

参数必须为零(参见不兼容ES 5更改:文字getter和setter函数现在必须正好具有零个或一个参数以获得更多信息);

为了更深入地理解,这两个文档链接确实可以完成这项工作!

相关问题