当前位置:首页 > 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实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

vue实现watch

vue实现watch

在 Vue 中实现 watch 的方法 Vue 的 watch 用于监听数据变化并执行相应的回调函数。以下是几种常见的实现方式: 基本用法 通过选项式 API 的 watch 属性监听数据变化:…

js实现复制到剪贴板

js实现复制到剪贴板

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

js实现选题

js实现选题

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

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…