这是关于JavaScript getter和setter如何工作的问题。
Mozilla将log4j实现为JavaScript模块(部分实现,只是Firefox Sync中预期用例所需的重要部分)包含以下getter / setter定义。
getter / setter中的'delete'为你做什么?那有什么意思?它似乎具有使第一次使用具有以下用途的不同结果的效果(但如果是这样,如何)?
get repository() {
delete Log4Moz.repository;
Log4Moz.repository = new LoggerRepository();
return Log4Moz.repository;
},
set repository(value) {
delete Log4Moz.repository;
Log4Moz.repository = value;
},
答案 0 :(得分:2)
问题(和现有答案)缺少一个重要的背景; getter和setter是在Log4Moz对象上定义的。考虑到这一点,当调用getter或setter并删除定义它的属性时会发生什么?
访问器属性上的 delete
(具有get / set的属性)与数据属性具有相同的效果,即它会删除该属性。执行delete Log4Moz.repository
后,repository
对象上不再存在Log4Moz
属性,并且getter / setter函数不再绑定到该属性。
分配给Log4Moz.repository
的下一行符合您的预期。在具有给定值的Log4Moz
对象中创建数据属性。
实际上,它的作用是在第一次访问(获取或设置)之后用一个data属性替换一个accessor属性,从而生成一个延迟初始化的数据属性。
答案 1 :(得分:1)
答案 2 :(得分:0)
delete operator删除对象的属性。如果你有一个对象
o = {a:“hello”,b:“world”};
你做了
删除o.a;
您的对象将如下所示
o = {b:“world”};
之后如果你这样做
o.a =“foo”;
它会向对象o添加新属性a并为其赋值“foo”,你的对象就像
o = {a:“foo”,b:“world”};