例如,我有以下内容:
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)被调用,虽然你可能会想检查GetValue
和PutValue
代替。容易记住,如果尝试向对象属性添加值或从对象属性获取值,它将检查它是否具有accessorDescriptor
并调用其各自的函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句