js如何区分getter和setter

时间:2015-10-12 15:16:10

标签: javascript

例如,我有以下内容:

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

并称之为:

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

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

3 个答案:

答案 0 :(得分:3)

它知道你是在读一个属性还是在没有明确的getter或设置被分配的情况下写一个属性的方式。它会查看是否存在赋值运算符。

答案 1 :(得分:2)

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

  

访问者属性描述符包含名为[[Get]]或[[Set]]

的任何字段

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




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

规范中有很多地方正在调用[[Get]](P)和[[Put]](P,V),尽管你可能想要查看{{1而是{}和} GetValue。更容易记住,如果您尝试将值放入或从对象属性获取值,它将检查它是否具有PutValue并将其称为相应的函数。< / p>

答案 2 :(得分:1)

来自文档(setget):

设置器:

  

它必须只有一个参数(请参阅不兼容的ES5更改:文字getter和setter函数现在必须具有完全零或一个参数以获取更多信息);

吸气剂:

  

它必须具有正好零参数(请参阅不兼容的ES5更改:文字getter和setter函数现在必须具有完全零或一个参数以获取更多信息);

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