const testObj = {};
// 创建暂存区
testObj.keep = {};
// 创建订阅函数
testObj.listen = function (key, fn) {
// 如果目标key不存在,初始化为空数组
if (!this.keep[key]) {
this.keep[key] = [];
}
this.keep[key].push(fn);
};
// 创建发布函数
testObj.triger = function () {
// 提取key
// 使用shift从arguments移除第一个参数并返回
// 注意: 由于arguments是一个类数组对象本身并不携带shift函数,所以需要通过call将arguments指定为shift的目标上下文
let key = Array.prototype.shift.call(arguments);
let fns = this.keep[key];
if (!fns || this.keep[key].length == 0) {
return false;
}
// 循环调用并且传递移除key后的所有参数
fns.forEach((item) => {
item.apply(this, arguments);
});
};
testObj.listen("test1", function (res) {
console.log(res); // 发布内容
});
testObj.triger("test1", "发布内容");