Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 属性的对象定义属性设置器_Javascript_Node.js - Fatal编程技术网

Javascript 属性的对象定义属性设置器

Javascript 属性的对象定义属性设置器,javascript,node.js,Javascript,Node.js,使用NodeJS,我试图跟踪对模型属性的更改,而不管它们可能是什么类型。使用Object.definePropertysetter通常效果很好,但对于对象和数组,如果设置了对象的属性,则无法跟踪所做的更改 我意识到setter不是对象本身,但是有没有办法让它像对象一样工作 例如,当设置setter的“属性”时,我是否可以获得下面的代码来触发setter var model = {}; model.attributes = {}; Object.defineProperty(model, 'op

使用NodeJS,我试图跟踪对模型属性的更改,而不管它们可能是什么类型。使用
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
属性来解决?是的,我最初的尝试有点草率,看看我编辑的版本。取决于你想如何使用它,你可能想把它扩展一点哈哈,这是一种偷偷摸摸的方法,但它是有效的。谢谢