模块代码:
const fs = require('fs');
class database {
constructor(database, object) {
typeof database === "object" && (object = database);
this.file = (typeof database === "string" ? database : 'db') + '.json';
object && fs.writeFileSync(this.file, JSON.stringify(object));
this.db = fs.existsSync(this.file) ? JSON.parse(fs.readFileSync(this.file, 'utf-8')) : {};
return new Proxy(this.db, this)
}
set(target, key, value) {
this.db[key] = value;
fs.writeFileSync(this.file, JSON.stringify(this.db));
}
}
module.exports = database;
示例脚本:
var db = require('./index.js')
var test = new db();
test.a = []; // Proxy is called here
test.a.push('a'); // It's not called here, despite test.a being set.
我希望set
处理程序在对象更新时随时触发,但是当推送到对象内部的数组时,它不会发生。为什么不解雇?
我正在使用节点v8.1.4。据说所有代理问题都是在v6之后修复的。
答案 0 :(得分:1)
不幸的是,代理只能观察对目标对象所做的更改 - 代理无法观察到嵌套在目标上的其他对象的更改。
test
和test.a
是两个独立的对象。因此,Proxy
每当对set
进行更改时都会调用test
,但只要对set
进行更改,它就不会调用test.a
。
如果您想观察对象和该对象的所有嵌套子对象的更改,那么您将需要为该作业构建use a library目的。