【问题标题】:Using delete in JavaScript getter / setter to delete the getter / setter在 JavaScript getter/setter 中使用 delete 删除 getter/setter
【发布时间】:2023-03-07 00:06:01
【问题描述】:

这是一个关于 JavaScript getter 和 setter 如何工作的问题。

Mozilla 作为 JavaScript 模块的 log4j 实现(部分实现,只是预期用例所需的重要部分,例如在 Firefox Sync 中)包含以下 getter/setter 定义。

getter/setter 中的“删除”对您有什么作用?那有什么意思?似乎有让第一次使用与后面使用不同的效果(但如果是,如何)?

get repository() {
  delete Log4Moz.repository;
  Log4Moz.repository = new LoggerRepository();
  return Log4Moz.repository;
},
set repository(value) {
  delete Log4Moz.repository;
  Log4Moz.repository = value;
},

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

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

    下一行,分配给Log4Moz.repository 的行为与您预期的一样。使用给定值在 Log4Moz 对象中创建数据属性。

    实际上,它的作用是在第一次访问(get 或 set)后将访问器属性替换为数据属性,从而生成延迟初始化的数据属性。

    【讨论】:

    • 这是“延迟初始化数据属性”的好习惯吗?没见过周围的人...
    • @DimitryK 好问题。我可能会建议反对它,因为它很难理解。虽然是similar idiom is documented on MDN,但我在野外看到的唯一代码是与 Mozilla 相关的。此外,我希望最近的 JS 引擎能够很好地优化 getter/setter 属性,以至于它对性能来说不是必需的。但是,与往常一样,您的里程可能会有所不同。
    【解决方案2】:

    来自 MDN:

    delete 运算符删除对象的属性。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

    【讨论】:

      【解决方案3】:

      delete 操作符删除对象的属性。如果你有一个对象

      o = { a : "你好", b : "世界" };

      你会的

      删除o.a;

      您的对象将如下所示

      o = {b : "世界" };

      然后如果你这样做了

      o.a = "foo";

      它将向对象o添加新属性a并为其分配值“foo”,您的对象将像

      o = { a : "foo", b : "world" };

      【讨论】:

      • 如果一开始就这样,o.a 之后还会是 getter(或 setter)吗?我猜不是,现在它只是一个值,对吧? (如何判断一个属性是否是 getter/setter?有没有办法检查/转储说明哪些属性是 getter/setter 的对象?)
      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多