面向对象的程序设计
面向对象的语言特点,他们都有一个类的概念,通过类可以创建任意多个具有相同属性和方法的对象
每个对象都是基于一个引用类型创建的
创造一个对象
var person = new Object();
person.name = 'zhangsan';
person.age = 29;
person.job = '程序员';
person.sayname = function(){
alert(this.name);
}
早期的构建一个对象
之后使用字面量语法构建对象
var person = {
name:'zhangsan',
age:29,
job:'程序员',
sayname:function(){
alert(this.name)
}
}
这些属性在创建时都带有一些特征值,javascrip通过这些特征值来定义它们的行为
属性类型
ECMAscript中有两种类型:数据属性和访问器属性
1、数据属性
数据类型包含一个数据值的位置,在这个位置可以读取和写入值
- configurable 表示能否通过delete删除属性重新定义属性,默认为true
- Enumerable 表示能否通过for-in循环返回属性,默认为true
- Writable 表示能否修改属性的值,默认为true
- Value 包含这个属性的数据值
var person = {
name : 'zhangsan'
}
这里创建了一个名为name的属性,指定的值为zhangsan,Value特性将设置为zhangsan
var person = {};
Object.defineProperty(person,'name',{
writable : false,
value : 'zhangsan'
})
alert(person.name)//zhangsan
person.name = 'lisi'
alert(person.name)//lisi
创建了一个名为name的属性,它的值为zhangsan,是不可修改的
var person = {}
person.defineProperty(person,'name',{
configurable:false,
value:'zhangsan'
})
alert(person.name)//zhangsan
delete person.name;
alert(person.name)//zhangsan
把configurable设置为false,表示不能从对象中删除属性
2、访问器属性
访问器属性不包含数据值:它们包含一对getter和setter函数,在读取访问器时,会调用get函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据
访问器属性有4个属性:
- Configurable 表示能否通过delete删除属性从而重新定义值
- Enumerable 表示能否通过for-in循环返回属性
- Get 在读取属性时调用的函数
- Set 在写入属性时调用的函数
访问器属性不能直接定义,必须使用Object.defineProperty()来定义
var book = {
_year : 2004,
edition : 1
}
Object.defineProperty(book,'year',{
get:function(){
return this._year
}
set:function(newValue){
this._year = newValue;
this.edition+=newValue - 2004
}
})
book.year = 2005;
alert(book.edition) // 2
只是使用访问器属性的常见方式,设置一个属性的值会到导致其他属性发生改变
不一定非要同时指定getter和setter,只指定getter的话,表示属性是不能写的
定义多个属性
由于为对象定义多个属性的可能性很大,通过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;
}
}
}
})
以上代码在book对象上定义了两个数据属性(_year和edition)和一个访问器属性(year)
读取属性的特性
使用Object.getOwnPropertyDescriptor()方法,这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称,返回值是一个对象,如果是访问器属性,这个对象的属性有configurable、enumberable、get和set,如果为数据属性,这个对象的属性有configurable、enumberable、writable、value。