高程 6.1理解对象自读

对象

对象拥有属性,

属性类型

数据属性访问器属性

数据属性

数据属性包含数据值:Value
数据属性的特征(用来描述数据属性的行为)

[[Configurable]]:
- 能否通过delete 删除属性从而重新定义属性
- 能否修改属性的特性
- 能否把属性修改为访问器属性
[[Enumerable]]
-表示能否通过for-in 循环返回属性
[[Writable]]
-能否修改属性的
[[Value]]
-包含这个属性的数据值,是属性的读写位置 默认undefined

修改特征:
需要使用Object.defineProperty()方法: —-(ES5)
Object.defineProperty(obj,”name”,{描述符对象})

var person = {};
Object.defineProperty(person, "name", {
    writable: false,//特征 不能修改属性的值 
    value: "Nicholas"//特征 本是读写位置 但因writable:false 所以只读

    /*描述符对象*/
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
/*高程代码 DataPropertiesExample01.htm  【p140】*/
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
//- 不能通过delete 删除属性从而重新定义属性  (1)
//- ***不能修改属性的特性 ***                (2)
//- 不能把属性修改为访问器属性               (3)

value: "Nicholas"
});
//抛出错误
Object.defineProperty(person, "name", {
configurable: true,//因为(2)所以此时再次修改 报错
value: "Nicholas"
});  

/*在调用Object.defineProperty()方法时,如果不指定,configurable、enumerable 和writable 特性的默认值都是false*/

/*直接在对象上设置属性时三个默认值都是true*/

IE8 是第一个实现Object.defineProperty()方法的浏览器版本。然而,这个
版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器
属性。由于实现不彻底,建议读者不要在IE8 中使用Object.defineProperty()
方法。———————————————————-高程【P141】

访问器属性

访问器属性不包含数据值: (没有Value
读:getter()函数
写:setter()函数
访问器属性的特征:

[[Configurable]]:
- 能否通过delete 删除属性从而重新定义属性
- 能否修改属性的特性
- 能否把属性修改为数据属性 (对比数据属性的特征)
- 默认为ture
[[Enumerable]]
-表示能否通过for-in 循环返回属性 直接在对象上定义的属性,这
个特性的默认值为true。
[[Get]]
-读取属性 默认undefined
[[Set]]
-设置属性 默认undefined

使用Object.defineProperty()来定义

var book = {
    _year: 2004,//表示只能通过对象方法访问的属性
    edition: 1
};
Object.defineProperty(book, "year", {
//year是访问器属性,影响到了_year和edition属性
    get: function(){
            return this._year;//返回_year属性值
        },
    set: function(newValue){
            if (newValue > 2004) {
            this._year = newValue;//重新赋值_year
            this.edition += newValue - 2004;//关连处理edition
            }
        }
});
book.year = 2005;
alert(book.edition); //2
//高程----AccessorPropertiesExample01.htm【p141】

支持ECMAScript 5 的这个方法的浏览器有IE9+(IE8 只是部分实现)、Firefox 4+、Safari 5+、Opera12+ 和Chrome 。
在这个方法之前, 要创建访问器属性, 一般都使用两个非标准的方法:_defineGetter_()和_defineSetter_()。这两个方法最初是由Firefox 引入的,后来Safari 3、 Chrome 1 和Opera 9.5 也给出了相同的实现。


var book = {
    _year: 2004,
    edition: 1
};
//定义访问器的旧有方法
book.__defineGetter__("year", function(){
    return this._year;
});
book.__defineSetter__("year", function(newValue){
    if (newValue > 2004) {
    this._year = newValue;
    this.edition += newValue - 2004;
    }
});
book.year = 2005;
alert(book.edition); //2
//AccessorPropertiesExample02.htm【p142】

定义多个属性

Object.defineProperties()方法。

var book = {};
Object.defineProperties(book, {
    _year: {
    value: 2004
    },
    edition: {
    value: 1
    },
    year: {
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
            }
        }
    }
});
//MultiplePropertiesExample01.htm

读取属性的特征

Object.getOwnPropertyDescriptor()方法

收两个参数:
属性所在的对象
要读取其描述符的属性名称。
返回值:是一个对象
如果是 访问器属性
属性有configurable、enumerable、get 和set;
如果是 数据属性
属性有configurable、enumerable、writable 和value

var book = {};
Object.defineProperties(book, {//定义多个属性
    _year: {
        value: 2004
    },
    edition: {
        value: 1
    },
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            if(newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");//获取描述符对象
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
                //GetPropertyDescriptorExample01.htm【p143-144】

Object.getOwnPropertyDescriptor()方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值