js如何区分getter和setter

马克斯·科雷茨基(Max Koretskyi)

例如,我有以下内容:

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

并这样称呼它:

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

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

减四

每当Javascript尝试为属性分配或获取值时,它都会尝试解析引用,请检查引用是否为对象属性,最后检查其是否为accessorDescriptor

访问者属性描述符是一个包含名为[[Get]]或[[Set]]的任何字段的描述符

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

设置器不仅可以通过赋值运算符来调用:

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);

[[Get]]和[[Put]]对象内部操作主要处理isAccessorDescriptor逻辑,尽管某些其他抽象操作也可以执行这些检查。

有一堆关于规范地方[[获取](P)和地方[将](P,V)被调用,虽然你可能会想检查GetValuePutValue代替。容易记住,如果尝试向对象属性添加值或从对象属性获取值,它将检查它是否具有accessorDescriptor并调用其各自的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章