例如,我有以下内容:
var o = {
get path() {
return _path;
}
set path() {
_path=p;
}
}
并称之为:
o.path // getter is called
o.path = 4 // setter is called
js如何知道在每种情况下调用哪个函数?
答案 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)