在写一个响应式系统时,遇到了一个问题,一个依赖收集器要用行为委托的对象
保存好,还是用类
来保存好。
先看看这两段代码:
- 对象
// 依赖收集器对象
const DepObj = {
subscriber: new Set(),
depend() {
if (activeEffect) {
this.subscriber.add(activeEffect)
}
},
notify() {
this.subscriber.forEach(effect => {
effect()
})
}
}
- 类
// 依赖收集器类
class DepClass {
constructor() {
this.subscriber = new Set()
}
depend() {
if (activeEffect) {
this.subscriber.add(activeEffect)
}
}
notify() {
this.subscriber.forEach(effect => {
effect()
})
}
}
我们进行对两个不同类型的对象进行实例或创造:
const depObj = Object.create(DepObj)
const depClass= new DepClass()
情况一
当我们执行depend
收集依赖后,对应的subscriber
属性添加一个集合时,
activeEffect = () => {
console.log('add')
}
depObj.depend() // 进行收集
// 此时我们再创建一个对象
const o = Object.create(DepObj)
// !! 进行判断两个对象
console.log(depObj === o) // false
console.log(depObj.subscriber === o.subscriber) // true !!
可以看出,如果用Object.create创建新的对象
,是实现继承原型的功效,而里面的属性和方法并没有达到创建新的。
这样的情况下,depObj.subscriber的值也会被o.subscriber顺着原型链寻找获得
。然后我们的notify
函数都会通知到他们,这是我们不想要的答案。
从这里也可以看出,Object.create()有种对对象的一种浅拷贝的行为
。
下面是Object.create的实现
Object.create = function(o) {
function F(){}
F.prototype = o
return new F()
}
情况二
如果我们是用类来收集依赖
activeEffect = () => {
console.log('add')
}
depClass.depend() // 进行收集
// 此时我们再实例一个类
const c = new DepClass()
// !! 进行判断两个对象
console.log(depClass === c) // false
console.log(depClass.subscriber === c.subscriber) // false
收集到的依赖是独立的,不会共享数据。
结果: 应该选择类
来定义依赖器。