Javascript 属性的对象定义属性设置器
使用NodeJS,我试图跟踪对模型属性的更改,而不管它们可能是什么类型。使用Javascript 属性的对象定义属性设置器,javascript,node.js,Javascript,Node.js,使用NodeJS,我试图跟踪对模型属性的更改,而不管它们可能是什么类型。使用Object.definePropertysetter通常效果很好,但对于对象和数组,如果设置了对象的属性,则无法跟踪所做的更改 我意识到setter不是对象本身,但是有没有办法让它像对象一样工作 例如,当设置setter的“属性”时,我是否可以获得下面的代码来触发setter var model = {}; model.attributes = {}; Object.defineProperty(model, 'op
Object.defineProperty
setter通常效果很好,但对于对象和数组,如果设置了对象的属性,则无法跟踪所做的更改
我意识到setter不是对象本身,但是有没有办法让它像对象一样工作
例如,当设置setter的“属性”时,我是否可以获得下面的代码来触发setter
var model = {};
model.attributes = {};
Object.defineProperty(model, 'options', {
get: function() {
return this.attributes.options;
},
set: function(value) {
console.log('changed options from:', this.attributes.options, 'to', value);
this.attributes.options = value;
}
});
model.options = {};
model.options = { a: 50 }; // triggers setter
model.options.b = 60; // doesn't trigger setter, how can I get it to do so?
如果您使用的是支持代理的ES6 transpiler,则可以解决以下问题:
var handler = {
defineProperty (target, key, descriptor) {
console.log('changed options from:', target[key], 'to', descriptor.value);
if(typeof descriptor.value === 'object'){
descriptor.value = new Proxy(descriptor.value,handler);
}
Object.defineProperty(target, key, descriptor);
return true;
}
}
var target = {}
var proxy = new Proxy(target, handler)
proxy.foo = 'bar2' // changed from undefined to bar2
proxy.foo = 'bar' // changed from bar2 to bar
proxy.options = { a: 50 } // changed from undefined to Object { a: 50 }
proxy.options.a = 15 // changed from 50 to 15
proxy.options.b = 60 // changed from undefined to 60
受文章的启发,如果您使用支持代理的ES6 transpiler,您可以解决以下问题:
var handler = {
defineProperty (target, key, descriptor) {
console.log('changed options from:', target[key], 'to', descriptor.value);
if(typeof descriptor.value === 'object'){
descriptor.value = new Proxy(descriptor.value,handler);
}
Object.defineProperty(target, key, descriptor);
return true;
}
}
var target = {}
var proxy = new Proxy(target, handler)
proxy.foo = 'bar2' // changed from undefined to bar2
proxy.foo = 'bar' // changed from bar2 to bar
proxy.options = { a: 50 } // changed from undefined to Object { a: 50 }
proxy.options.a = 15 // changed from 50 to 15
proxy.options.b = 60 // changed from undefined to 60
简而言之,您不能订阅未知属性,包括ODP的子属性。查看Object.observe()-typestuff@dandavis啊,糟糕透了。看起来Node只支持Object.observe的最新版本(即非稳定版本),所以我可能会探索其他一些方法。谢谢你的帮助!简而言之,Harmony代理可能会帮助您:不,您不能订阅未知属性,包括ODP的子属性。查看Object.observe()-typestuff@dandavis啊,糟糕透了。看起来Node只支持Object.observe的最新版本(即非稳定版本),所以我可能会探索其他一些方法。谢谢你的帮助!Harmony代理可能会帮助您代理可能能够做到这一点,但此实现并没有解决核心问题:检测何时定义/设置嵌套属性。你可以看到我在这里的意思:也许这可以通过处理程序的
set
属性来解决?是的,我最初的尝试有点草率,看看我编辑的版本。取决于你想如何使用它,你可能想把它扩展一点哈哈,这是一种偷偷摸摸的方法,但它是有效的。谢谢代理可能能够做到这一点,但此实现并没有解决核心问题:检测何时定义/设置嵌套属性。你可以看到我在这里的意思:也许这可以通过处理程序的set
属性来解决?是的,我最初的尝试有点草率,看看我编辑的版本。取决于你想如何使用它,你可能想把它扩展一点哈哈,这是一种偷偷摸摸的方法,但它是有效的。谢谢