August
  • August
  • Javascript
    • Array 的三个技巧
    • 相等比较 - Object.is()
    • ES6 正则拓展
    • Javascript 中的响应式与 Proxy
  • Git
    • Mac 配置 ssh
    • Git - 常用命令
    • Git - 恢复撤销
  • Mac
    • MacOS 异常解决方案
  • Redis
    • Install and config Redis on Mac OS X via Homebrew
  • Linux
    • Linux查看磁盘空间(df, du)
  • Others
    • Google Extensions
Powered by GitBook
On this page
  1. Javascript

Javascript 中的响应式与 Proxy

>

let data = { price: 5, quantity: 2 };
let target = null;
class Dep {
    constructor() {
        this.subscribers = [];
    }
    depend() {
        if (target && !this.subscribers.includes(target)) {
            this.subscribers.push(target);
        }
    }
    notify() {
        this.subscribers.forEach(sub => sub());
    }
}

let deps = new Map(); // 创建一个Map对象
Object.keys(data).forEach(key => {
    // 为每个属性都设置一个依赖实例 并放入 deps 中
    deps.set(key, new Dep());
});
let data_without_proxy = data; // 保存源对象
data = new Proxy(data_without_proxy, {
    // 重写数据以在中间创建一个代理
    get(obj, key) {
        deps.get(key).depend(); // 依旧为存储target
        return obj[key]; // 返回原始数据
    },
    set(obj, key, newVal) {
        obj[key] = newVal; // 将原始数据设置为新值
        deps.get(key).notify(); // 依旧为重新运行已存储的targets
        return true;
    }
});

// 模拟监听
function watcher(myFunc) {
    target = myFunc;
    target();
    target = null;
}

let total = 0
watcher(() => {
    total = data.price * data.quantity;
    console.log("total = ", total);
});
data.price = 20;
data.quantity = 10;

deps.set('discount', new Dep())
data.discount = 5;
let salePrice = 0;
watcher(() => {
    salePrice = data.price - data.discount;
    console.log("salePrice = ", salePrice);
});
data.discount = 7.5
PreviousES6 正则拓展NextMac 配置 ssh

Last updated 6 years ago