你不知道的JS系列 ( 36 ) - [[Get]] 和 [[Put]]
[[Get]]
对象访问在实现上有个微妙却非常重要的细节
var myObject = { a: 2 } myObject.a; // 2
myObject.a 是一次属性访问,在实现上,myObject.a 在 myObject 上实际上实现了 [[Get]] 操作(有点像函数调用:[[Get]]() )。首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值。如果没有找到,按照 [[Get]] 算法的定义会执行另外一种非常重要的行为,就是遍历可能存在的原型链。如果无论如何都没有找到,会返回值 undefined
var myObject = { a: 2 } myObject.b; // undefined
[[Put]]
你可能认为给对象的属性赋值会触发 [[Put]] 来设置或者创建这个属性,但是实际上并不完全这样。[[Put]] 被触发是,实际上的行为取决于许多因素,包括对象中是否存在这个属性。如果已经存在这个属性
1、属性是否是访问描述符,如果是并且存在 setter 就调用 setter 2、属性的数据描述符 writable 是否是 false,是会调用失败,严格模式会抛出异常 3、如果都不是,将该值设置为属性的值
如果对象中不存在这个属性,[[Put]] 操作会更加复杂