在JavaScript getter / setter中使用delete来删除getter / setter

时间:2012-04-02 21:19:22

标签: javascript

这是关于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;
},

3 个答案:

答案 0 :(得分:2)

问题(和现有答案)缺少一个重要的背景; getter和setter是在Log4Moz对象上定义的。考虑到这一点,当调用getter或setter并删除定义它的属性时会发生什么?

访问器属性上的

delete(具有get / set的属性)与数据属性具有相同的效果,即它会删除该属性。执行delete Log4Moz.repository后,repository对象上不再存在Log4Moz属性,并且getter / setter函数不再绑定到该属性。

分配给Log4Moz.repository的下一行符合您的预期。在具有给定值的Log4Moz对象中创建数据属性。

实际上,它的作用是在第一次访问(获取或设置)之后用一个data属性替换一个accessor属性,从而生成一个延迟初始化的数据属性。

答案 1 :(得分:1)

来自MDN:

  

删除操作符删除对象的属性。

https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete

答案 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”};