当前位置:首页 > JavaScript

js实现watch

2026-04-05 21:23:35JavaScript

js实现watch

js实现watch

在JavaScript中实现类似Vue的watch功能

实现一个简单的数据监听器,当数据变化时触发回调函数。以下是几种常见方法:

使用Proxy实现数据监听

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

// 使用示例
const data = { count: 0 };
const watchedData = watch(data, (key, oldVal, newVal) => {
  console.log(`${key} changed from ${oldVal} to ${newVal}`);
});

watchedData.count = 1; // 输出: count 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(oldVal, newVal);
    }
  });
}

// 使用示例
const data = { count: 0 };
watch(data, 'count', (oldVal, newVal) => {
  console.log(`count changed from ${oldVal} to ${newVal}`);
});

data.count = 1; // 输出: count changed from 0 to 1

深度监听对象变化

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

// 使用示例
const data = { user: { name: 'Alice' } };
const watchedData = deepWatch(data, (key, oldVal, newVal) => {
  console.log(`${key} changed from ${oldVal} to ${newVal}`);
});

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

实现多属性监听

function createWatcher(target) {
  const callbacks = {};

  const proxy = new Proxy(target, {
    set(obj, prop, value) {
      const oldValue = obj[prop];
      obj[prop] = value;
      if (callbacks[prop]) {
        callbacks[prop].forEach(cb => cb(oldValue, value));
      }
      return true;
    }
  });

  return {
    data: proxy,
    watch(prop, callback) {
      if (!callbacks[prop]) callbacks[prop] = [];
      callbacks[prop].push(callback);
    }
  };
}

// 使用示例
const { data, watch } = createWatcher({ count: 0, name: '' });
watch('count', (oldVal, newVal) => {
  console.log(`Count changed: ${oldVal} → ${newVal}`);
});
watch('name', (oldVal, newVal) => {
  console.log(`Name changed: ${oldVal} → ${newVal}`);
});

data.count = 1; // 输出: Count changed: 0 → 1
data.name = 'Alice'; // 输出: Name changed:  → Alice

这些方法展示了JavaScript中实现数据监听的不同方式,可以根据具体需求选择适合的方案。Proxy方案更现代且功能更强大,而Object.defineProperty方案则兼容性更好。

标签: jswatch
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…

js 多选 实现

js 多选 实现

实现多选的 JavaScript 方法 使用复选框(Checkbox)实现多选 通过 HTML 的 checkbox 元素配合 JavaScript 实现多选功能。用户可以选择多个选项,提交时获取所有…