对象的 定义属性 读取属性 访问器属性

 深入理解对象-定义属性
        ECMAScript中有两种属性:数据属性、访问器属性。
        这两种属性用于设置属性的高级属性,例如该属性是否可以配置,是否可以读写,是否可以遍历,并且可以通过setter,getter来监听数据的改变。
    数据属性特性
        数据属性 例如name属性
        包含一个属性值的位置,这个位置可以读取和写入值。数据属性特性如下
        [[Configurable]]
            表示是否通过delete删除属性从而重新定义属性,能否修改属性的特性,
            或者能否把属性修改为访问器属性(属性直接定义在对象中,默认为true)。
             当为false时,不能重新定义不能使用delete删除。
        [[Enumerable]]
                表示能否通过for-in循环返回属性。(属性直接定义在对象中,默认为true)
        ​[[Writable]] 
​        表示能否修改属性的值。(属性直接定义在对象中,默认为true)
        [[Value]] 
​         包含这个属性的数据值 name:jacky
        要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)方法



      Object.defineProperty()
        Object.defineProperty(obj, prop, descriptor)
            参数说明:
            1. obj:必需。目标对象
            2. prop:必需。需定义或修改的属性的名字
            3. descriptor:必需。目标属性所拥有的特性
        注意:当我们创建一个对象并且为对象设置一个属性的时候,
        该属性默认特性Configurable、Enumerable、Writable默认都为true,
        value为该属性的值。
    Object.defineProperties()--修改或者定义多个属性
        参数说明:
        1. obj:必需。目标对象
        2. props:该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置


    9.读取属性的特性
        Object.getOwnPropertyDescriptor()
        功能:
        该方法返回指定对象上一个自有属性对应的属性描述符。
        (自有属性指的是直接赋予该对象的属性,
        不需要从原型链上进行查找的属性)
        Object.getOwnPropertyDescriptor(obj,'name')
        Object.getOwnPropertyDescriptors()
        功能:
        所指定对象的所有自身属性的描述符,如果没有任何自身属性,
        则返回空对象。


    10.访问器属性特性
        访问器属性:这个属性不包含数据值,包含的是一对get和set方法,
        在读写访问器属性时,就是通过这两个方法来进行操作处理的。
        访问器属性包含的四个特性:
        [[Configurable]]
    ​     表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,    默认为false
        [[Enumerable]]
    ​     表示能否通过for-in循环返回属性,默认为false
        [[Get]]
    ​     在读取属性时调用的函数,默认值为undefined
        [[Set]]
    ​     在写入属性时调用的函数,默认值为undefined
    ​     这里要注意下,访问器属性不能直接定义,要通过Object.defineProperty()这个方法来定义。
        // 访问器属性不包含数值 它包含的是一对getter和setter函数;
        // 访问器属性是写在Object.defineProperty 不能直接对其设置
       

 var obj={
            _year:2000,
            editor:1
        }
        Object.defineProperty(obj,'year',{
            get:function(){
                return this._year
            },
            set:function(newYear){
                if(newYear!=this._year){
                    this._year=newYear;
                    this.editor++;
                }
            }
        });
        console.log(obj.year,'未修改前');
        obj.year=2001;
        console.log(obj.year,'修改后');
        console.log(obj.editor,'修改后');
        console.log(Object.getOwnPropertyDescriptor(obj,'_year'));

你可能感兴趣的:(javascript)