
本文旨在解决当实例字段为数组时,如何监听数组的变动(例如 push 或 splice 操作)并执行额外任务的问题。通过使用 JavaScript 的 Proxy 对象,我们可以拦截对数组 length 属性的修改,从而在数组发生变化时触发自定义逻辑,例如更新 sessionStorage。本文将提供详细的代码示例和解释,帮助开发者理解和应用这一技术。
当我们需要在一个类的实例字段(该字段是一个数组)发生变化时,执行一些额外的操作,比如更新 sessionStorage,直接使用 set 访问器是无法实现的。因为 push、splice 等数组方法并不会触发 set 访问器。 为了解决这个问题,我们可以使用 JavaScript 的 Proxy 对象。
Proxy 对象可以拦截对象的操作,包括属性的读取、赋值、删除等。我们可以创建一个 Proxy 对象来代理数组,并拦截对数组 length 属性的修改。当数组的 length 属性发生变化时,我们就可以执行额外的任务。
以下是一个示例代码:
class Environment {
constructor() {
// 初始化数组,从 sessionStorage 获取或创建一个空数组
const crumbList =
JSON.parse(sessionStorage.getItem('crumbs') ?? null) ?? [];
this.crumbs = new Proxy(crumbList, {
set(obj, prop, value) {
// debugger; // 可以使用 debugger 进行调试
// console.log({ obj, prop, value }); // 打印相关信息
// 执行默认的 set 操作
const result = Reflect.set(...arguments);
// 只有当修改的是 length 属性时,才执行额外的任务
if (prop === 'length') {
// 更新 sessionStorage
sessionStorage.setItem('crumbs', JSON.stringify(crumbList));
}
return result;
}
});
// 添加 valueOf 方法,返回数组的浅拷贝
Object.defineProperty(this.crumbs, 'valueOf', {
value: function valueOf () {
return [...crumbList];
},
});
}
}
const env = new Environment();
const metricId = 6;
const concept = 'Back orders';
const crumb = { metricId, concept };
env.crumbs.push(crumb);
env.crumbs.push('foo');
env.crumbs.push('bar');
env.crumbs.length = 5;
env.crumbs.push('baz');
env.crumbs.push('biz');
env.crumbs.length = 9;
console.log('... after initial `push` operations and `crumbs.length` changes ...');
console.log({ "current value": env.crumbs });
env.crumbs.shift();
env.crumbs.pop();
env.crumbs.pop();
console.log('... after `shift` and `pop` operations ...');
console.log({ "current value": env.crumbs });
env.crumbs.splice(1, 3);
console.log('... after a final `splice` operation ...');
console.log({ "current valueOf()": env.crumbs.valueOf() });
console.log({ "currently stored JSON": sessionStorage.getItem('crumbs') });代码解释:
注意事项:
通过使用 Proxy 对象,我们可以方便地监听数组的变动并执行额外的任务。这种方法可以应用于各种场景,例如数据同步、状态管理等。希望本文能够帮助读者理解和应用这一技术。
以上就是监听数组变动并触发额外任务:使用 Proxy 实现数组属性的实时更新的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号