高程 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()方法
- 高程 6.1理解对象自读
- JS高程之对象篇——理解对象
- JS高程6.面向对象的程序设计(1)理解对象
- JS对象创建及继承精简描述[整理自高程第3版]
- 135 js 高程6.1
- 对 js 高程 Preflighted Reqeusts 的理解
- 高程3笔记2:面向对象1
- 高层自读--创建对象
- JavaScript高程学习笔记之面向对象的程序设计(6)
- JS高程知识点总结-6(面向对象)
- js高程笔记之对象篇——创建对象的几种方式
- 对象理解...
- 理解对象
- 高程资料
- 考高程
- JavaScript 高程
- 文件版式,自理解
- 自编码器理解
- 视图和索引
- ubuntu 16.04下chrome浏览器Flash过期解决方法
- JSP中三种弹出对话框的用法实例
- PLSQL错误处理和循环
- 行人检测论文笔记:Pedestrian Detection - A Benchmark
- 高程 6.1理解对象自读
- 分页查询和交并集
- java学习日记_100:线程的第二种实现方式——实现Runnable接口
- 1040. Longest Symmetric String
- C++之操作符重载
- 内容观察者
- 素数标记 Interesting Numbers URAL - 2070
- Game!
- shell脚本