我定义了一个Person构造函数
function Person(){
}
然后定义了一个对象
var per1 = new Person();
在Person原型对象中定义了一个属性like,并将可写性设置为false
Object.defineProperty(Person.prototype,"like",{
value:"eating",
enumerable:false,
writable:false,
configurable:true
});
修改per1的like值
per1的like属性不可更改,这是为什么?原型对象的writable为何会影响到实例对象上?
随后我又将原型对象的writable置为true
Object.defineProperty(Person.prototype,"like",{
value:"eating",
enumerable:false,
writable:true,
configurable:true
});
per1的like属性值可更改了,随后我再将原型对象的writable置为false
Object.defineProperty(Person.prototype,"like",{
value:"eating",
enumerable:false,
writable:false,
configurable:true
});
而per1的like属性又不再受到原型writable的影响,此时运行如下
那么原型对象的writable到底是如何实例对象的,为什么会产生如上效果
JS中属性的读取和设置是不同的
读取的时候按实例对象->原型对象->原型对象..的顺序查找,都找不到返回undefined
而赋值时,首先在实例对象中寻找是否有属性,
如果没有这个属性,那么就把这个属性添加到实例对象上;
但是有例外,如果其原型链中有这个属性,但其为只读,那么就不会实例对象上添加这个新的属性,赋值操作无效
如果其原型链中有这个属性,但其不为只读,那么就会在实例对象上添加这个新的属性
如果能再实例对象上找到这个属性,那么直接对此属性赋值(也不一定看其是否只读)
like属性是定义在其原型上的并且其只读,那么
per1.like的任何修改都是无效的,也不会在当前实例对象上添加like属性
per1.like的可被修改,在当前实例对象上添加了属性like
此时你再
此时per1的实例上已经有了like属性,那就直接修改喽