JavaScript 在原型链中设置属性值
考虑obj.a=123;
1、如果当obj对象中存在名为a的属性时,这条赋值语句只会修改原有属性的值。
2、如果a不直接存在于obj中时,则会遍历原型链,如果原型链中也不存在时,则直接添加到obj中。
3、如果a不直接存在于obj中,但存在于原型链中时,有三种情况:
a、属性a的 writable:true 时,则直接在obj中新增一个名为a的新属性。
b、属性a的 writable:false 时,则无法在obj中新增属性,也不能修改已有属性a的值。
c、属性a是一个 setter 时,则不会在obj中新增属性,而是调用该 setter,且不会重新定义该 setter。
注意:第二第三种情况可以使用 Object.defineProperty(obj,"a",{}) 向obj中新增a属性。