当前位置:首页 > JavaScript

js实现watch

2026-02-01 04:59:46JavaScript

实现 watch 功能的方法

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

使用 Proxy 实现

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

js实现watch

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

兼容性更好的传统方法:

js实现watch

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

深度监听实现

递归监听嵌套对象:

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实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现复制到剪贴板

js实现复制到剪贴板

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

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…