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