Object.defineProperty只能修改setter吗?
Can Object.defineProperty only modify the setter?
我希望我的对象有一个字段,当读取时返回字段的值,当val写入字段时,我想在写入它之前修改val。我现在的代码是这样的:
function Cat(lives) {
var self = this;
var privateLives;
Object.defineProperty(self, 'publicLives', {
get: function() {return privateLives;},
set: function(val) {privateLives = 7 * val;}
});
}
有没有办法做到这一点,而不做一个私有变量?理想情况下,我只需将setter设置为:
function(val) {self.publicLives = 7 * val;}
,但这会导致setter调用自身时溢出。是否有某种方法可以使它不循环setter(因此只有setter作用域外的赋值才能调用setter而setter中的赋值只是进行正常的赋值)?如果可能,当setter写入公共字段时,我也不需要显式地定义getter。
不,这是不可能的-一个属性只能是数据属性或访问器属性,不能两者兼而有之。当然,您不一定需要将值存储在setter的私有变量中,您也可以使用不同的属性或不同对象的属性(如@Oriol的代理)。如果你想避免私有变量,"私有"属性是标准的方法:
function Cat(lives) {
this.publicLives = lives;
}
Object.defineProperty(Cat.prototype, 'publicLives', {
get: function() {return this._privateLives;},
set: function(val) { this._privateLives = 7 * val;}
});
但是你也可以做一些棘手的事情,通过使用一个反复重新定义的常量getter函数来隐藏"私有变量":
Object.defineProperty(Cat.prototype, 'publicLives', {
set: function setter(val) {
val *= 7;
Object.defineProperty(this, 'publicLives', {
get: function() { return val; }
set: setter,
configurable: true
});
}
});
在ES6中,另一种选择是使用带有[[Set]] trap的Proxy对象:
function Cat(lives) {
return new Proxy(this, {
set: function(target, prop, val) {
target[prop] = val;
if (prop === 'publicLives') target[prop] *= 7;
return true;
}
});
}
相关文章:
- 在Safari执行javascript之前对其进行修改
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 用Javascript修改内部标记的CSS规则
- "实例范围”;TypeScript类的getter/setter
- 绑定Range输入以修改样式
- 可以从Chrome扩展修改窗口对象吗
- jQuery滚动器插件修改
- 将函数从onclick修改为onload
- jQuery UI自动完成-修改问题
- Javascript日期修改
- 如何通过JQuery修改样式属性
- 使用treewalker修改表
- Angularjs:修改js中的作用域,稍后在页面中使用
- 在编译阶段后创建新的DOM树,或者继续使用原始修改的DOM
- 修改控制器AngularJS的全局值
- 修改数据后,setState不会触发重新渲染
- 通过sdk/system/events在修改请求观测器上测试http
- GWT:有没有一种方法可以修改GWT在编译中使用的Cast.java文件
- 在多个元素上使用jquery插件,只需稍作修改
- Object.defineProperty只能修改setter吗?