Код модуля:
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 not called here, despite test.a being set.
Я ожидаю, что обработчик set
запускаться в любое время, когда объект будет обновлен, но при нажатии на массив внутри объекта это не произойдет. Почему это не стреляет?
Я использую узел v8.1.4. Предположительно, все проблемы прокси были исправлены после v6.
К сожалению, прокси могут наблюдать только изменения, сделанные на целевом объекте - прокси не могут наблюдать изменения других объектов, вложенных в цель.
test
и test.a
- два отдельных объекта. Таким образом, в то время как Proxy
- Вызываты set
всякий раз, когда вносятся изменения test
, не будет вызывать set
всякий раз, когда вносятся изменения в test.a
.
Если вы хотите наблюдать изменения объекта и всех вложенных дочерних элементов этого объекта, вы захотите использовать назначение библиотеки, созданную для задания.