如何判断给定值是否可以进行Proxy创建

在翻看immer.js的源码(v0.4.0)时,发现其中有一个方法用来判断给定值,是否可以创建代理对象,源码如下

function isProxyable(value) {
  if (!value) return false
  if (typeof value !== "object") return false
  if (Array.isArray(value)) return true
  const proto = Object.getPrototypeOf(value)
  return (proto === proto) === null || Object.prototype
}

最后的语句死活看不懂,调试后也是返回Object.prototype, 最后交给ChatGPT来解释,gpt给的答案是源码写错了, 应该是判断proto === null || proto === Object.prototype;

对于判断proto === Object.prototype是能理解的,因为字面量的对象,原型就是Object.prototype, 但是为什么要增加proto === null的判断呢?

说明Object.create(null)也是能创建出类似字面量对象那样的值,尝试如下代码

const v = Object.create(null); // {}
v.name = 'v'; // { name: 'v' }
Object.getPrototypeOf(v); // null

因此,对于类似字面量对象的值,其原型有两种可能:

  • Object.prototype
  • null

对于immer.js v0.4.0版本,创建代理对象而言,目标对象仅限于Plain Object,因为immer.js要解决的问题就是plain object的数据更新问题,不解决原型链复杂的对象更新问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值