var o = { get x(){ return 7; }, set x(val){ console.info("不能设置x的值"); } } o.x //7 读取x值的时候,会使用get方法 o.x = 9 //不能设置x的值 赋值x时,会使用set方法
get/set与原型链
//不包含get/set的原型 function p(){} p.prototype.z = 9; var p1 = new p(); p1.z //9 //对象上没有属性,将在原型链上查找 p1.z = 10; //原型上不包含get/set方法时,向原型上的同名属性赋值,会在对象上添加此属性 p1.z //10 //对象上能够找到属性,将不会在原型链上查找
//原型上包含get/set方法 function person(){} Object.defineProperty(person.prototype,‘z‘,{get:function(){return 1}}); var p = new person(); p.z //1 p.z = 89; p.z //still 1 原型链上get/set方法,操作此属性的时候,会向上查找原型链。 所以p.z仍旧是1
//那个问题来了,在原型链上有get/set方法的时候,怎么实现在对象上添加此属性呢? function foo(){} Object.defineProperty(foo.prototype,‘z‘,{get:function(){return 1}}) var f = new foo(); f.z //1 f.z = 2; f.z //still 1 Object.defineProperty(f,‘z‘,{value:100,configurable:true,writable:true}); f.hasOwnProperty(‘z‘) //true f.z //100 f.z = 90; f.z //90 delete f.z //true f.hasOwnProperty(‘z‘) //false f.z //1 回到原型链查找
时间: 2024-10-07 05:31:47