zh众所周知,vue2.x版本是经过Object.defineProperty() 种的get进行拦截,set进行发送, vue
其实这只是表面理解,实际运用的是 JavaScript 的 订阅者、发布者模式。数组
首先,了解一下什么是 订阅者、发布者模式 吧。bash
w3c 上是这么定义的 函数
能够用一个图来理解 ui
首先咱们来实现一下使用原型链的写法吧this
//定义一个函数,用来承载
function publisher () {
//定义一个空数组用来接收传递过来数据
this.arr = [];
}
publisher.prototype = {
//订阅
subscribe : function (fn) {
//订阅将'订阅者'push到arr数组中
this.arr.push (fn)
},
//解除订阅
unSubscribe : function (fn) {
//过滤订阅者,若是'订阅者'el存在arr数组中,就解绑订阅
this.arr = this.arr.forEach(function (el) {
if(el !== fn) {
return el;
}
})
},
//更新订阅内容
upDate : function (o,thisObj) {
//o => 剩余订阅者
var scoped = thisObj || window ;
//或者
var scoped = thisObj || this.subscribe;
this.fns.forEach (function (el) {
// scoped 能够随便设置,el最终会替换scoped,将o 剩余订阅者传递进arr数组,将
订阅的人的信息打印出来
el.call(scoped,o)
})
}
}
//建立一个实例
var newSubScribe = new publisher () ;
//建立一个订阅者
var user = function (data) {
console.log (` 第一位订阅者 ${data} 订阅了。`)
}
//建立第二位订阅者
var newUser = function (data) {
console.log (` 第二位订阅者 ${data} 订阅了。`)
}
//绑定订阅
newSubScribe.subscribe(user);
newSubScribe.subscribe(newUser);
//更新订阅内容,看下效果
newSubScribe.upDate(`Z先生`);
//解绑第一个订阅者
newSubScribe.unSubscribe(user);
//在更新下数据
newSubScribe.upDate(`Z女士`);
/*
下面咱们看下打印结果
*/
复制代码
能够看到,已经实现了,第一位订阅者没有了,只剩第二位 订阅者了,固然实现的方法有不少种,这只是其中一种使用原型链spa
实现prototype