都晓得js是面向对象的,建立了对象后,对象中保存的就是一组组名值对,值可所以数据范例或函数。不论函数照样数据,都能够称为某某对象的属性。再细分,属性能够有两个范例:数据属性或接见器属性。
因而,数据属性不要误会为是数据的属性范例,函数的属性范例也是数据属性的。
var obj = {say:function(){return this.name;},age:11};
console.log(Object.getOwnPropertyDescriptors(obj));
//输出{value: ƒ, writable: true, enumerable: true, configurable: true}
数据属性(4个):
value: 人人熟知的一样,保存的是数据值,假如是函数,保存的就是全部函数。
writable: 是不是可修正,设置为false能够奇妙定义出”私有变量”。true示意可修正,false则相反。
enumerable: 该属性是不是可被罗列出。true示意可罗列,false则相反。
configurable: delete属性有没有用,可否修正value和enumerable属性,可否把属性改成接见器属性。true就是都能够,false就是都不能够。
接见器属性(4个):
configurable:同上
enumerable: 同上
get:一个用于接见其他属性值的函数
set:一个用于修正其他属性值的函数
关于这些属性范例,能够修正,用defineProperty()或defineProperties();能够读取,用getOwnPropertyDescriptor()或getOwnPropertyDescriptors()。固然,接见器属性只能用defineProperty()或defineProperties()建立。
一些细节:
var obj = {say:function(){return this.name;},age:11};
Object.defineProperty(obj,"name",{});
console.log(Object.getOwnPropertyDescriptors(obj));
//输出效果以下:
//age:{value: 11, writable: true, enumerable: true, configurable: true}
//name:{value: undefined, writable: false, enumerable: false, configurable: false}
//say:{value: ƒ, writable: true, enumerable: true, configurable: true}
能够看出,函数say是有value的数据属性;age是建立对象时定义的,一切属性特征都是true;name是用defineProperty()定义的,默以为数据属性,一切属性特征默以为false。
var obj = {age:11};
Object.defineProperty(obj,"age",{
configurable:false
});
Object.defineProperty(obj,"age",{
writable:false,
// enumerable:false, 会报错
// configurable:true, 会报错
value:12
});
Object.defineProperty(obj,"name",{
configurable:false, //假如不指定,默许也都是false
value:2
});
Object.defineProperty(obj,"name",{
// writable:false, 会报错
// enumerable:false, 会报错
// configurable:true, 会报错
// value:12 会报错
});
建立时定义的属性:修正了configurable后,实在照样能够修正writable和value属性的。
defineProperty()定义的属性:configurable一旦是false,今后就不可能在变动任何属性。
接见器属性临时想到的,就是经由过程转变该属性转变内部多个属性。而且,假如某属性writable是false,接见器属性转变该属性会无效。