javascript - 在 JavaScript 中,是否可以绕过 setter?
问题描述
我有一个o
带有原型的对象p
:
var p = {}
var o = Object.create(p)
可以给a
对象添加一个属性o
,然后给原型添加一个同名的setter p
:
o.a = 1
Object.defineProperty(p, 'a', {set: function(value) {}});
console.log(o.a); // 1
但是,如果我们尝试在 setter之后添加属性,它不会被添加到o
- 而是调用 setter:
Object.defineProperty(p, 'a', {set: function(value) {}});
o.a = 1
console.log(o.a); // undefined
是否可以先定义setter,然后绕过它a
直接将属性添加到o
?
解决方案
您可以defineProperty
再次使用并设置writable
为true
. 您可能还想设置enumerable
andconfigurable
因为它们默认为false
. 您不需要将value
默认设置为undefined
,但我认为它更清楚。
var p = {}
var o = Object.create(p)
Object.defineProperty(p, 'a', {set: function(value) {console.log("value:", value)}})
o.a = "test" // logs "value: test"
// override setter
Object.defineProperty(o, 'a', {value:undefined, writable:true, enumerable:true, configurable:true})
console.log(o.a); // undefined
o.a = 1
console.log(o.a); // 1
console.log(Object.keys(o))
推荐阅读
- azure - 我想为我的 Azure 门户获取所有资源的明智计费
- jquery - ie9动画旋转如何使用
- java - Java 快速排序分区方法
- git - Git:如何在 SourceTree 中取消存储特定文件?
- mysql - 安装centos 7后mysql 8无法登录
- node.js - 处理程序函数中的 AWS Lambda Node JS 8.10 语法错误
- c# - xamarin 形成清晰的选择器选择
- angular - 如何根据条件限制路由更改 Angular 5 应用程序?
- android - Cannot access to my module nested dependency in android
- node.js - 将 URL 发送到sails lift 命令