模拟属性屏蔽
我们简单实现构造一个原型含有属性a
的原型对象obj
let proto = {
a: 'this is a',
}
let obj = Object.create(proto)
console.log('it should be [true]:', proto.isPrototypeOf(obj))
console.log('it should be [this is a]:', obj.a)
obj.a = 'change'
console.log('it should be [changed]:', obj.a)
可以得知,一般情况下:
- 当原型中存在同名属性时,会被底层属性赋值产生的同名属性屏蔽
属性屏蔽的三种情况
当a
不直接存在于obj
,而是存在于obj
的原型上时,执行obj.a = 'newValue'
时可能的三种情况:
- 一般情况,同名可屏蔽当
prototype
存在同名属性值,并且没有标记为只读(writable: true
)时,那么会在obj
添加一个同名属性,产生属性屏蔽 - 原型存在同名只读属性,无法屏蔽当
prototype
存在同名属性值,并且被标记为只读(writable: false
)时,那么无法添加同名属性,即无法屏蔽 - 原型存在同名setter,无法屏蔽,必定执行当
prototype
存在同名属性值,并且是一个setter时,此时无法覆盖setter,并且一定会调用这个setter