高程 6.1理解对象自读

来源:互联网 发布:淘宝外包多少钱 编辑:程序博客网 时间:2024/04/30 05:17

对象

对象拥有属性,

属性类型

数据属性访问器属性

数据属性

数据属性包含数据值: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); //2004alert(descriptor.configurable); //falsealert(typeof descriptor.get); //"undefined"var descriptor = Object.getOwnPropertyDescriptor(book, "year");alert(descriptor.value); //undefinedalert(descriptor.enumerable); //falsealert(typeof descriptor.get); //"function"                //GetPropertyDescriptorExample01.htm【p143-144】

Object.getOwnPropertyDescriptor()方法

0 0
原创粉丝点击