js在给对象写属性时是不查找原型链的,只有读取是才会查找原型链,但是下面这种情况怎么解释呢?
var obj = {};
Object.defineProperty(obj,'x',{
value: 1,
writable: false,
configurable: false,
enumerable: false
});
var obj1 = Object.create(obj);
obj1.x = 10;
console.log(obj1.x); // 仍然是1,这样是不是说查找了原型链了呢
比如说myObject.foo = "bar",这里分为以下的几种情况:
如果myObject对象中包含名为foo的普通数据访问属性,那么修改已有的属性值;
如果foo不存在于myObject对象中,它的原型链就会被遍历,如果原型链中没有foo属性,那么foo属性被添加到myObject对象里;
如果foo属性存在于原型链中,那么又会分为三种情况:
a:原型链中存在foo属性,但没有被标记为只读(writable:true),那么就会在myObject中添加一个foo属性,屏蔽原型链中的属性;
b:原型链中存在foo属性,但被标记为只读(writable:false),那么无法修改已有属性或者在myObject上创建屏蔽属性。代码如果运行在严格模式下,代码会报错。否则,这条赋值语句会被忽略。总之,就是不发生屏蔽;
c:原型链中存在foo属性,但它是一个setter(自己定义的赋值函数)。这种情况下,foo不会被添加到myObject中,也不会重新定义setter。
注意: