原型属性屏蔽

2020/05/22 Javascript 共 1252 字,约 4 分钟

模拟属性屏蔽

我们简单实现构造一个原型含有属性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'时可能的三种情况:

  1. 一般情况,同名可屏蔽prototype存在同名属性值,并且没有标记为只读(writable: true)时,那么会在obj添加一个同名属性,产生属性屏蔽
  2. 原型存在同名只读属性,无法屏蔽prototype存在同名属性值,并且被标记为只读(writable: false)时,那么无法添加同名属性,即无法屏蔽
  3. 原型存在同名setter,无法屏蔽,必定执行prototype存在同名属性值,并且是一个setter时,此时无法覆盖setter,并且一定会调用这个setter

原型存在同名只读属性,无法屏蔽

原型存在同名setter,无法屏蔽,必定执行


Search

    Table of Contents