【笔记】js高级程序设计:数据属性和访问器属性

ECMAScript中有两种属性:数据属性和访问器属性

1.数据属性

数据属性是包含一个数据值的位置。

数据属性有四个描述其行为的特性:

[[Configurable]]:(可配置)能否通过delete删除属性,能否修改属性特性,能否将属性改为访问器属性;

[[Enumerable]]:(可枚举)能否通过for-in循环返回属性;

[[Writable]]:能否修改属性值;

[[Value]]:保存着属性值;

要修改属性默认特性,必须使用ECMAScript5中的Object.defineProperty(属性所在对象,属性名字,特性描述符)方法

var person={};
Object.defineProperty(person,"name",{
    configurable:false,  //person对象的name属性不可配置
    value:"joy" //name属性值设置为joy
});
alert(person.name);//joy
delete person.name;//删除无效
alert(person.name);//joy

注意:将configurable设置为false后就不能再设为true了(可配置设为不可配置后就不能变回可配置了)

var person={};
Object.defineProperty(person,"name",{
    configurable:false,  //person对象的name属性不可配置
    value:"joy" //name属性值设置为joy
});
Object.defineProperty(person,"name",{
    configurable:true //can't redefine non-configurable property "name"
});
alert(person.name);//joy
delete person.name;//删除无效
alert(person.name);//joy

2.访问器属性

访问器属性不包含属性值,它包含一对getter,setter函数.

让两个属性建立关联,即设置一个属性的值会导致其他属性的值发生变化.

四个特性:

[[configurable]]:(可配置)能否通过delete删除属性,能否修改属性特性,能否修改为数据属性;

[[Enumerable]]:(可枚举)能否通过for-in循环返回属性

[[get]]:读取属性时调用

[[set]]:写入属性时调用

var person={
    _name:"joy" //下划线开头用来表示只能通过对象方法来访问的属性
};
Object.defineProperty(person,"name",{
    get:function(){
        return this._name;
    },
    set:function(newValue){
        this._name=newValue;
    }
});
person.name="xiaoming";
alert(person.name);//xiaoming

定义多个属性的方法:Object.defineProperties()

var person={};
Object.defineProperties(person,{
    _name:{
        value:"joy",
        writable:true //当数据属性和访问器属性共存是,必须显示指定writable属性,否则访问器失效
    },
    _age:{
        value:28,
        writable:true //必须显示指定writable属性
    },

    age:{
        get:function(){
            return this._age;
        },
        set:function(newValue){
            if(newValue>120 || newValue<0){
                alert("wodale");
                this._age=0;
            }else{
                this._age=newValue;
            }
        }
    }

});
person.age=50;
alert(person.age); //50
posted @ 2016-03-29 11:43  清如许HG  阅读(236)  评论(0)    收藏  举报