【问题标题】:Is there a way to override Object to instantiate a property upon attempting to modify it?有没有办法在尝试修改它时覆盖 Object 以实例化一个属性?
【发布时间】:2021-01-04 16:42:41
【问题描述】:

我觉得在我使用过的大多数语言中,除了 PHP 之外,我觉得这个问题的答案很难否定,至少曾经有一些奇怪的极端情况,比如$someArray['nonexistentKey']++

我基本上是想写一个稀疏对象,其中每个属性都是一个数字计数器。如果未定义,计数器应返回 0,如果您尝试递增它们,则应自动将其定义为 0。

换句话说,我想覆盖通用 Object getter 以在所有情况下返回 0,它会返回 undefined... 987654326@.

所以理论上,任何尚未定义的属性的重载都将get 将其初始化为零。比如这个:

myObj['hugePrimeNumberToBaseXToString']++;

然后会变成 1。

在过去,我觉得 Object.__proto__ 的某种方式可能适用于这种情况......

【问题讨论】:

标签: javascript typescript


【解决方案1】:

我想你想要的是Proxy

您可以使用代理来拦截属性获取并返回您自己的逻辑。在这种情况下,如果是 undefined 属性,则返回零。

// Hold the data
const target: { [key in string]: number } = {}

// Access the data
const proxy = new Proxy(target, {
    get(target, prop, receiver) {
        if (typeof prop === 'string') {
            if (target[prop] === undefined) return 0
            return target[prop]
        }
        return undefined
    }
})

proxy['hugePrimeNumberToBaseXToString']++
console.log(proxy['hugePrimeNumberToBaseXToString']) //=> 1

Playground

【讨论】:

  • 哇。我已经这样做了很长时间,并编写了各种粗糙的方法来检查对象是否被外部操纵,缺少 object.watch(),我不知道你可以在基本层面上做到这一点。谢谢。
【解决方案2】:

Proxy 绝对是正确的答案,但我认为直接修改 Object 比你想的要深入得多。

相反,我会创建一个新的、简单的对象类型,如下所示:

const Dictionary = function() {}

Dictionary.prototype.add = function(key) {
  if (this.hasOwnProperty(key)) {
    this[key] += 1;
  } else {
    this[key] = 1;
  }
}

const dict = new Dictionary();

dict.add("apples");

console.log(dict.apples) // 1

dict.add("apples");
dict.add("bananas");

console.log(dict.apples, dict.bananas) // 2, 1

这不是您想要的,因为您每次都必须调用 add,但为了简单和可扩展性,我会采取三个字符的折衷方案。

Codepen

【讨论】:

  • 我喜欢这个,因为它类似于 AS3。还回答了自我参考问题,但没有像我希望的那样直接得到任何属性的 getter/setter。最终,我试图创建这样的 TypeScript 类,它只接受某些键类型,所以这可能是一个更好的方法,因为在搞砸之后,我认为 TypeScript 不允许你以这种方式扩展 Proxy。无论如何,谢谢你的替代答案。这里有很好的思考过程。
  • 是的,我在考虑 Python 的 .get 字典方法,如果不存在默认值,它允许使用默认值——精确地重新创建它是微不足道的。
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多