数据监听的简单实现

复习前端犀牛书,看到了订阅者发布者模式;有感而发,谢了一个小demo,实现了简单的数据监听

function Observer(data) {
    this.data = data;
    this.addMethod(data);
}

Observer.prototype.addMethod = function (obj) { // 枚举传入对象的所有属性
    var val = null;
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            val = obj[i];
            typeof obj[i] === 'object' ? new Observer(obj[i]) : null; // 如果是引用类型,递归
            this.convert(val, i);
        }
    }
};

Observer.prototype.convert = function (value, key) { // 对属性进行配置
    Object.defineProperty(this.data, key, {
        enumerable: true,
        configurable: true,
        get: function () {
            return value;
        },
        set: function (newValue) {
            if (newValue === value) return false; // 忽略不改变值的赋值操作
            if ('' === newValue) { // 空值一律赋值为undefined
               value = undefined;
            } else {
               value = newValue;
            }
            emitFn(key, newValue); // 值改变的后续操作
        },
    })
};

function emitFn(key, value) {
    emitFNObj[key](value)
}

var emitFNObj = {
    name: function (value) { // name属性改变后触发
        alert('name is change to ' + value);
    },
};

var app = new Observer({ // 实例化
    name: undefined,
});

app.data.name = 'Eric'; // 触发弹窗
吐个槽,这个富文本好难受啊,复制粘贴的时候,还有空格


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值