当前位置:首页 > JavaScript

watch js实现

2026-04-05 21:07:52JavaScript

watch.js 实现方法

watch.js 是一个轻量级的 JavaScript 库,用于监视对象属性的变化。以下是几种实现方法:

使用 Object.defineProperty

通过 Object.defineProperty 可以定义属性的 getter 和 setter,从而在属性被访问或修改时触发回调。

function watch(obj, prop, callback) {
  let value = obj[prop];
  Object.defineProperty(obj, prop, {
    get() {
      return value;
    },
    set(newValue) {
      if (newValue !== value) {
        const oldValue = value;
        value = newValue;
        callback(newValue, oldValue);
      }
    }
  });
}

使用 Proxy

Proxy 可以拦截对象的操作,提供更灵活的监视能力。

function watch(obj, callback) {
  return new Proxy(obj, {
    set(target, prop, value) {
      const oldValue = target[prop];
      if (value !== oldValue) {
        target[prop] = value;
        callback(prop, value, oldValue);
      }
      return true;
    }
  });
}

使用第三方库

如果不想手动实现,可以使用现成的库如 watch.jsmobx

watch js实现

// 使用 watch.js 库
const obj = { a: 1 };
watch(obj, (prop, action, newValue, oldValue) => {
  console.log(`Property ${prop} changed from ${oldValue} to ${newValue}`);
});
obj.a = 2; // 触发回调

注意事项

  • Object.defineProperty 只能监视已有属性,无法检测新增属性。
  • Proxy 可以监视所有属性变化,包括新增属性,但兼容性较差。
  • 第三方库通常提供更全面的功能,如深度监视、批量更新等。

标签: watchjs
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…