javascript - javascript - 以编程方式添加和删除智能 getter
问题描述
我正在尝试以编程方式从对象中添加和删除(出于缓存目的)getter。我正在添加这样的吸气剂:
Object.defineProperty(obj, 'text', {
get: getter
})
obj.text
仅应在第一次访问时对其进行评估,并将计算出的值缓存以供后续调用。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get展示了如何实现这样的智能吸气剂:
get notifier() {
delete this.notifier;
return this.notifier = document.getElementById('bookmarked-notification-anchor');
}
但是,我不能delete this.text
在我的getter
函数中使用。我发现,这this
是 Object 的原型而不是实例 - 对吗?如果是这样,我如何删除实例的 getter 并将其替换为计算值?
编辑:
根据评论,getter 和 object 看起来像这样:
var obj = {}
obj.value = '2018-04-21T12:00:00Z000'
Object.defineProperty(obj, 'text', {
get: function () {
delete this.text // doesn't seem to work
if (this.value == null) return ''
var text = this.value.split('T')[0].split('-').reverse().join('.')
this.text = text
return text // return this.text ends in Maximum call stack size exceeded
}
})
解决方案
您需要使属性可配置,以便您可以删除它:
var obj = {value: '2018-04-21T12:00:00Z000'};
Object.defineProperty(obj, 'text', {
get: function () {
delete this.text
if (this.value == null) return ''
var text = this.value.split('T')[0].split('-').reverse().join('.')
console.log("updating")
this.text = text
return text
},
configurable: true
//^^^^^^^^^^^^^^^^^^
});
console.log("first access");
console.log(obj.text);
console.log("second access");
console.log(obj.text);
除此之外,如果你对从原型对象继承的属性有问题,你不能删除它,但需要使用defineProperty
它来隐藏它。
推荐阅读
- jsf - 如何展开动态子菜单
- python - Ansible 更新到 2.8 后找不到 Python 库
- mysql - 使用 MySQL 5.7 运行 Sphinx 2.2.11 不起作用
- python - 用 python ping
- firefox - 如何在 Firefox 中使用 WebRTC 获取块数据?
- php - 连接()到 unix:/var/run/php/php7.2-fpm.sock 失败(错误)
- google-cloud-datastore - 默认情况下,Datastore 客户端 SDK 中的匿名结构是否扁平化?
- c++-cli - 如何在 C++/CLI 中声明 IEnumerable?
- c++ - 在命名空间中声明变量
- c - 超出时间限制 - 斐波那契