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);
3条答案
按热度按时间woobm2wo1#
这与它知道你是在阅读属性还是在写属性时没有显式赋值getter或setting的方法是一样的,它查看是否有赋值运算符。
wkftcu5l2#
每次Javascript试图为属性赋值或获取值时,它都会尝试解析引用,检查引用是否为对象属性,最后检查引用是否为
accessorDescriptor
:访问器属性说明符是包含任何名为Get或Set的字段的属性说明符
setter不仅可以用赋值运算符调用:
Get和Set对象内部操作主要处理
isAccessorDescriptor
逻辑,尽管也有某些其他抽象操作可以执行这些检查。在规范中有很多地方调用了Get(P)和Set(P,V),尽管你可能想检查
GetValue
和PutValue
。如果你试图向对象属性中输入值或从对象属性中获取值,它会检查它是否有accessorDescriptor
,并调用它各自的函数,这会更容易记住。mu0hgdu03#
来自文档(set和get):
设置器:
必须只有一个参数(参见不兼容ES 5更改:文字getter和setter函数现在必须正好具有零个或一个参数以获得更多信息);
吸气剂:
参数必须为零(参见不兼容ES 5更改:文字getter和setter函数现在必须正好具有零个或一个参数以获得更多信息);
为了更深入地理解,这两个文档链接确实可以完成这项工作!