当前位置:首页 > 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

深度监听实现

递归监听嵌套对象:

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

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

js实现watch

标签: jswatch
分享给朋友:

相关文章

js实现动画

js实现动画

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

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…