js中对象属性的整顿

都晓得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,接见器属性转变该属性会无效。

    原文作者:你才到碗里去
    原文地址: https://segmentfault.com/a/1190000013511133
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞