你不知道的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]] 操作会更加复杂

 

posted @ 2020-03-25 06:26  wzndkj  阅读(346)  评论(0编辑  收藏  举报