首页 > 代码库 > 面向对象的程序设计(一)
面向对象的程序设计(一)
一、理解对象
var person = new Object(); person.name = "Nicholas"; person.age= 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); };
名为person的对象,并未它天街了三个属性和一个方法。用字面量语法可以写成这样:
var person ={ name : "Nicholas"; age: 29; job : "Software Engineer"; sayName : function(){ alert(this.name); } };
二、属性类型
1、数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。
■ [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问其属性。特性默认的值为true。
■ [[Enumerable]:表示能否通过for-in循环返回属性。默认值为true。
■ [[Writable]]:表示能否修改属性的值。默认值true。
■ [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。默认值undefined。
要修改属性默认的特性,必须使用ECMAScript5的Object/defineProperty()方法。这个方法接受三个参数:属性所在的对象、属性的名字和一个描述符对象。描述符对象的属性必须是:configurable、enumerable、writable、value。设置其中的一或多个值,可以修改对应的特性值。例如:
var person = {}; object.defineProperty(person,"name",{ writable: false, value: "Nicholas" }); alert(person.name); person.name = "Grey"; alert(person.name);
这个例子创建了一个name属性,只读。
var person = {}; object.defineProperty(person,"name",{ configurable: false, value: "Nicholas" }); alert(person.name); person.name = "Grey"; alert(person.name);
configurable设置为false,表示不能从对像中删除谁许属性。一旦把属性定义为不可配置的,就不能再把它便会可配置了。此时,再调用Oject.defineProperty()方法修改除writable之外的特性,都会导致错误。
可以多次调用Object.defineProperty()方法修改同一个属性,但是把configurable特性设置为false之后就会有限制。
2、访问器属性
访问其属性不包含数据值:他们包含一对getter和setter函数(不是必需的)。在读取访问器属性时,调用getter函数。在写入访问器时,会调用settr函数并传入新值,这个函数负责决定如何处理数据。访问器属性有4个特性。
■ [[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(newVlue>2004){
this._year = newVlue;
this.edition+=newVlue- 2004;
}
}
});
book.year=2005;
alert(book.edition);
_year前面的下划线是一种常见的记号,用于表示只能通过对象方法访问的属性。
面向对象的程序设计(一)