这篇文章给大家带来的是关于js中的对象? 关于js中如何使用对象的总结有一定的参考价值,有需要的朋友可以参考一下,希望对你有帮助。
属性描述符
提供内部数据结构,用于描述对象的值并控制其行为,例如属性是否可写、可配置、可修改和可枚举。 这种内部数据结构称为“属性描述符”。
每个属性都有自己对应的属性描述符,保存了属性的元信息。
{ value:'前端', writable:false, enumerable:true, configurable:false, get:undefined, set:undefined }
登录复制
目前对象中存在两种主要形式的属性描述符:数据描述符和访问描述符
数据描述符
数据描述符是具有值的属性,该值可能是可写的,也可能是不可写的。 数据描述符具有以下可选键值:
访问描述符
访问描述符是由函数对描述的属性。 访问描述符具有以下可选键:
获取属性描述符
.ptor() 方法返回与指定对象上自己的属性相对应的属性描述符。
Object.getOwnPropertyDescriptor(obj,prop)
登录复制
var obj={} obj.attr='前端'; console.log(Object.getOwnPropertyDescriptor(obj,'attr'));
登录复制
设置属性描述符
1..() 方法为对象定义新属性或修改现有属性并返回该对象
Object.defineProperty(obj,prop,descriptor);
登录复制
2..()方法为一个对象定义一个或多个新属性或修改现有属性,并返回该对象
Object.defineProperties(obj,props)
登录复制
属性描述符的可选键
1.value:表示目标属性对应的值。 可以是任何有效值(数字、对象、函数等)。默认为
var obj={}; obj.name='张三'; var attr=Object.getOwnPropertyDescriptor(obj,'name'); console.log(attr.value); Object.defineProperty(obj,'name',{value:'李四'}); console.log(obj.name);
登录复制
2.:value,表示目标属性的值是否可以修改。 当该属性为 true 时,可以通过赋值运算符更改该值。 默认为 false
var obj={}; Object.defineProperty(obj,'attr',{ value:'前端', writable:false }); console.log(obj.attr); obj.attr=100; console.log(obj.attr);
登录复制
3.:value,表示目标属性的描述符是否可以修改。 当属性为true时,可以更改属性描述符,也可以从相应的对象中删除该属性。 默认为 false
var obj=Object.definePropety({},'attr',{ value:'大前端', configurable:false }); Object.definePropety(obj,'attr',{value:100}); Object.definePropety(obj,'attr',{writable:true}); Object.definePropety(obj,'attr',{enumerable:true}); Object.definePropety(obj,'attr',{configurable:true});
登录复制
4.:值,表示目标属性是否可以遍历。 当该属性为true时,该属性可以出现在对象的枚举属性中。 默认为 false
如果对象的属性值为 false,则以下三个操作无法获取该属性:
var obj={}; Object.defineProperty(obj,'attr',{value:'前端',enumerable:false}); for(var key in obj){console.log(key);} console.log(Object.keys(obj)); console.log(JSON.stringify(obj));
登录复制
属性描述符的访问器
除了直接定义之外,对象的属性还可以使用访问器来定义。 其中,是存储功能,使用属性描述符中的集合; 是值函数,使用属性描述符中的get
var obj=Object.defineProperty({},'attr',{ get:function(){ return '前端'; }, set:function(){ console.log('setter:'+value); } }); console.log(obj.attr); obj.attr=100;
登录复制
除了上面的访问器写法之外,还提供了以下写法:
var obj={ get attr(){ return '前端'; }, set attr(value){ console.log('setter:'+value); } } console.log(obj.attr); obj.attr=100;
登录复制
防篡改
默认情况下,定义的对象可以随时随地修改该对象的属性或方法,无论有意义还是无意义。
而这些篡改可能会影响对象的内置属性或方法,从而导致对象的正常功能可能无法使用。
1.禁止扩展:禁止对象扩展新的属性或方法
var obj={}; Object.preventExtensions(obj); obj.attr='前端'; console.log(Object.isExtensible(obj)); console.log(obj.attr);
登录复制
2.密封对象:禁止扩展新的属性或方法,禁止配置现有属性或方法的描述符,只允许读写属性的值
var sealed={}; Object.seal(sealed); Object.isSealed(sealed); Object.isExtensible(sealed);
登录复制
3.冻结对象:禁止对对象进行任何修改操作
var frozen={1:81}; Object.isFrozen(frozen); Object.freeze(frozen); Object.isFrozen(frozen); Object.isSealed(frozen); Object.isExtensible(frozen);
登录复制