当前位置:首页 > JavaScript

js实现watch

2026-02-01 04:59:46JavaScript

实现 watch 功能的方法

在 JavaScript 中,watch 功能通常用于监听对象属性的变化。以下是几种实现方式:

使用 Proxy 实现

Proxy 可以拦截对象的操作,适合现代浏览器环境:

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

const obj = { count: 0 };
const watchedObj = watch(obj, 'count', (newVal, oldVal) => {
  console.log(`Changed from ${oldVal} to ${newVal}`);
});

watchedObj.count = 1; // 输出: Changed from 0 to 1

使用 Object.defineProperty

兼容性更好的传统方法:

function watch(obj, prop, callback) {
  let value = obj[prop];
  Object.defineProperty(obj, prop, {
    get() {
      return value;
    },
    set(newVal) {
      const oldVal = value;
      value = newVal;
      callback(newVal, oldVal);
    }
  });
}

const obj = { count: 0 };
watch(obj, 'count', (newVal, oldVal) => {
  console.log(`Changed from ${oldVal} to ${newVal}`);
});

obj.count = 1; // 输出: Changed from 0 to 1

使用第三方库

Vue 等框架提供了响应式系统:

// Vue 3 示例
import { ref, watch } from 'vue';

const count = ref(0);
watch(count, (newVal, oldVal) => {
  console.log(`Changed from ${oldVal} to ${newVal}`);
});

count.value = 1; // 输出: Changed from 0 to 1

深度监听实现

递归监听嵌套对象:

js实现watch

function deepWatch(obj, callback) {
  return new Proxy(obj, {
    set(target, key, value) {
      const oldVal = target[key];
      if (typeof value === 'object' && value !== null) {
        value = deepWatch(value, callback);
      }
      target[key] = value;
      callback(key, value, oldVal);
      return true;
    }
  });
}

const obj = deepWatch({ user: { name: 'Alice' } }, (key, newVal, oldVal) => {
  console.log(`${key} changed from`, oldVal, 'to', newVal);
});

obj.user.name = 'Bob'; // 输出: name changed from Alice to Bob

这些方法提供了不同场景下的属性监听解决方案,可根据项目需求选择合适的方式。

标签: jswatch
分享给朋友:

相关文章

js实现继承

js实现继承

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

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现复制到剪贴板

js实现复制到剪贴板

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

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…