声明:此文是小编对《JavaScript高级程序设计》的总结笔记
面向对象(Object-Oriented)就是OO语言
官方定义:无序属性的集合,其属性可以包含基本值、对象或者函数。
属性类型: 分为数据属性、访问器属性
一、数据属性:
特性:
【【Configurable】】表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性 默认为true 【【Enumerable】】表示能否通过for-in循环返回属性 默认为true 【【Writable】】表示能否修改属性的值 默认为true 【【Value】】包含这个属性的数据值 默认为default
修改特性的方法:Object.defineProperty(),这个方法接收三个参数,属性所在的对象、属性的名字、描述符对象(就是指的属性的特性)。
例:
var person = {}; Object.defineProperty(person,"name",{ writable : false, value : "Nicholas" });
注!:
1、当把属性设置为只读(既writable:false),则不能再对该属性赋值,在严格模式下会出错。
2、当把configurable设置为false,表示不能从对象中删除属性。如果对这个属性调用delete,则在严格模式下会导致错误。而且,一旦把属性定义为不可配置的,就不能在把它变回可配置了。此时,再调用Object.defineProperty()方法修改除writable之外的特 性,都会导致 错误。
3、第一次调用Object.defineProperty()方法,如果不指定,configurable]enumerable和writable特性的默认值都会变成false,再调用该方法修改某一特性则其他特性保持不变
二、访问器属性:
特性:
【【Configurable】】表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性 默认为true
【【Enumerable】】表示能否通过for-in循环返回属性 默认为true
【【Get】】在读取属性时调用的函数 默认值为undefined
【【Set】】在写入属性时调用的函数 默认值为undefined
修改访问器属性的方法:Object.defineProperty(),和修改数据属性的方法一样
例:
var book = { _year : 2004, //下划线是一种约定俗成的常用记号,表示只通过对象方法调用,平时不调用,在属性命名规则上没有特殊意义 edition:1 }; Object.defineProperty(book,"year",{ get:function () { return this._year; }, set : function (newValue) { if(newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.edition) //2
注!:
1、只指定get意味着属性时不能写,只指定set函数的属性也不能读。
拓展:
某些浏览器还支持两种保留的方法来设置set个get函数
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);
注!:在不支持Object.defineProperty()方法的浏览器中不能修改【【Configurable】】和【【Enumerable】】属性
三、定义多个属性:Object.defineProperties(),此方法接收两个对象参数,第一个对象是要添加和修改其属性的对象名称,第二个对象是要添加或修改的属性键值对
例:
var book = {}; Object.defineProperties(book,{ _year : { writable : true, value : 2004 }, edition : { writable : true, value : 1 }, year : { get:function () { return this._year; }, set : function (newValue) { if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } } })
四、读取属性的特性:Object.getOwnPropertyDescriptor(),此方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回的是一个对象,该对象是对应属性的特性键值对。
例:
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" /* 对于数据属性_year,value等于最初的值,configurable是false,get等于undefined。 对于访问器属性year,value等于undefined,enumerable是false,get是一个纸箱get函数的指针。 */
浙公网安备 33010602011771号