首页 - 神途资讯 > 游戏陪玩平台源码开发,依赖收集和触发的实现

游戏陪玩平台源码开发,依赖收集和触发的实现

发布于:2024-04-08 作者:admin 阅读:71

2、用来传递数据;

3、data数据备用;

const map = new Map();
let current = null;
const data = {
    name: 'madapao',
    age: 18,
    sex: '男',
}

创建一个类

deps数组收集游戏陪玩平台源码依赖,add方法添加游戏陪玩平台源码依赖。

class Watcher {
    constructor() {
        this.deps = [];
    }
    add(dep) {
        this.deps.push(dep)
    }
}

收集和触发

对data中的数据进行劫持:

Object.keys(data).forEach(key => {
    Object.defineProperty(data, key, {
        get() {
            if (map.has(key)) {
                const watcher = map.get(key);
                watcher.add(current);
                map.set(key, watcher)
            } else {
                const watcher = new Watcher();
                watcher.add(current);
                deps.set(key, watcher);
            }
        },
        set() {
            if (map.has(key)) {
                map.get(key).deps.forEach(fn => fn())
            }
        }
    })
})

使用

在执行方法,暂时把赋值给,使用data中数据key时。就会触发key的get。把放进key对应的deps中。

当修改key的值时,就会触发key对应收集到的所有方法。

function getAgeName() {
    current = getAgeName;
    console.log('getAgeName执行了')
    return `${data.name}'今年'${data.age}岁。`
}
function getSexName() {
    current = getSexName;
    console.log('getSexName执行了')
    return `${data.name}'是一个'${data.sex}人。`
}
getAgeName();
getSexName();
data.name = 'mahaha';

全部代码

const deps = new Map();
let current = null;
class Watcher {
    constructor() {
        this.deps = [];
    }
    add(dep) {
        this.deps.push(dep)
    }
}
const data = {
    name: 'madapao',
    age: 18,
    sex: '男',
}
Object.keys(data).forEach(key => {
    Object.defineProperty(data, key, {
        get() {
            if (deps.has(key)) {
                const watcher = deps.get(key);
                watcher.add(current);
                deps.set(key, watcher)
            } else {
                const watcher = new Watcher();
                watcher.add(current);
                deps.set(key, watcher);
            }
        },
        set() {
            if (deps.has(key)) {
                deps.get(key).deps.forEach(fn => fn())
            }
        }
    })
})
function getAgeName() {
    current = getAgeName;
    console.log('getAgeName执行了')
    return `${data.name}'今年'${data.age}岁。`
}
function getSexName() {
    current = getSexName;
    console.log('getSexName执行了')
    return `${data.name}'是一个'${data.sex}人。`
}
getAgeName();
getSexName();
data.name = 'mahaha';

以上便是“游戏陪玩平台源码开发,依赖收集和触发的实现”的全部内容,希望对大家有帮助。

二维码

扫一扫关注我们

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,请告知我们,本站将立刻删除涉嫌侵权内容。

相关文章