Object.create() 和 class的区别

在写一个响应式系统时,遇到了一个问题,一个依赖收集器要用行为委托的对象保存好,还是用来保存好。
先看看这两段代码:

  1. 对象
// 依赖收集器对象
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

收集到的依赖是独立的,不会共享数据。

结果: 应该选择来定义依赖器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值