prototype-shadow

关于shadow property, 并不是一直存在。

let exampleObj = {name: 'xiaohesong'}
let obj = Object.create(exampleObj)

按照you dont known js里说的,一句话概括,就是当前对象的原型链上存在某一个属性,比如上面的name属性,并且这个namewritable: true的, 而且这个属性(例如name)没有进行setter,那么如果obj.name = 'xx',就会在obj上创建一个shadow property(name).

如果上层链的是read-only(writable: false),那么严格模式下会报错,如果不是严格模式,那就忽略 不做处理,不会触发shadow

如果上层链的是setter,那么每次obj.name='xx'都会调用上层链的setter,并且不会重新定义setter.

当然了,如果你真的很想做一个shadow property, 可以不实用obj.name = 'xx'这种,使用obj.defineProperty.

Last updated