# 对象设置属性值

function baseAssignValue(object, key, value) {
  if (key == '__proto__') {
    Object.defineProperty(object, key, {
      'configurable': true,
      'enumerable': true,
      'value': value,
      'writable': true
    });
  } else {
    object[key] = value;
  }
}

__proto__不是对象的一个标准属性,本来它应该和对象其他自定义属性一样,不应该有任何特别的,但是由于历史原因,基本所有的浏览器都实现了这个属性,用来保存对象的原型。

并且根据MDN的描述,这个属性还有如下特点:

proto 的设置器(setter)允许对象的[[Prototype]]被变更。前提是这个对象必须通过 Object.isExtensible() (opens new window) 判断为是可扩展的,如果不可扩展,则会抛出一个TypeError (opens new window)错误。要变更的值必须是一个object或null (opens new window),提供其它值将不起任何作用。

也就是说,像其它属性一样,直接给__proto__赋值,如果值不是对象,或者是不可扩展的对象,是可能会报错的。

而且 __proto__ 也是不可枚举的。

因此,lodash使用defineProperty来给__proto__来赋值,并且将__proto__configurableenumerablewritable都设置为true,这样__proto__和其他属性一样,都是可配置、可枚举、可写的属性了。

最近更新时间: 2020/9/6 11:30:38