# 对象设置属性值
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__
的configurable
、enumerable
、writable
都设置为true
,这样__proto__
和其他属性一样,都是可配置、可枚举、可写的属性了。