做门户网站,北京朝阳网站设计,h5商城,晋城企业网站建设属性描述符 假设有一个对象obj var obj {a:1
}观察这个对象#xff0c;我们如何来描述属性a#xff1a; 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符
var desc Object.getOwnPropertyDescriptor(obj, a);
console.log(desc);我…属性描述符 假设有一个对象obj var obj {a:1
}观察这个对象我们如何来描述属性a 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符
var desc Object.getOwnPropertyDescriptor(obj, a);
console.log(desc);我们会得到一个对象 观察这个对象中的内容 configurable : true表示描述符本身能否修改enumerable : true 是否可遍历value : 1 值writable : true 是否可重写 设置属性描述符
Object.defineProperty(obj, a, {value:10,writable:false //表示不可重写
});
console.log(obj.a); // 10注如果修改了configurable的值为false后续再次修改属性描述符会报错。 Object.defineProperty(obj, a, {configurable:false
});
Object.defineProperty(obj, a, {value:20,
});
console.log(obj.a);但是如果属性设置了不可重写后续进行修改虽然不会报错但是不会修改成功
Object.defineProperty(obj, a, {value:10,writable:false //表示不可重写
});
console.log(obj.a); // 10
obj.a 20;
console.log(obj.a); // 10因此如果属性不能重写后续修改最好能进行报错告诉用户哪句话出现了问题。 为了解决上面的问题Object.defineProperty中有两个函数 读取器 getter设置器 setter 当读取属性a的值的时候会运行get函数设置属性a的值的时候会 运行set函数 Object.defineProperty(obj, a, {get:function(){console.log(get函数);},set:function(val){console.log(set函数);}
});
obj.a 20; // set函数
console.log(obj.a); // get函数注这里需要注意一个问题—无限递归问题 如果在get中读取属性或者在set中设置属性的值则会出现无限递归问题 Object.defineProperty(obj, a, {get:function(){return obj.a;},set:function(val){obj.a val;}
});
obj.a 20;
console.log(obj.a);使用样例
var internalValue obj.a;
Object.defineProperty(obj, a, {get:function(){console.log(get函数);return internalValue;},set:function(val){console.log(set函数);internalValue val;return internalValue;}
});
obj.a 20; // set函数
console.log(obj.a); // get函数 20因此假设该属性不能重写可以在set函数中抛出一个报错信息提示用户
Object.defineProperty(obj, a, {get:function(){console.log(get函数);},set:function(val){throw new Error(报错信息该属性不能赋值你正在给这个属性赋值为${val});}
})
console.log(obj.a);
obj.a 20;当然这里面也会出现问题需要考虑具体出现的问题具体分析。