js中的面向对象程序设计
js中的对象:一组无序属性的结合。
一、js中的对象
1.自定义对象
var person = new Object();
person.name = 'jack';
person.age = 29;
person.sayName = function(){
alert(this.name);
}
2.字面量对象
var person = {
name:'tom',
age:10,
sayName:function(){
alert(this.name);
}
};
二、js中属性的类型(属性有两种特性:数据属性+访问器属性)
1.数据属性
在js中不能直接访问,为了实现js引擎所用。
[[Configurable]]:是否能够通过delete删除属性,是否修改属性的特性,是否能把数据属性改为访问器属性。默认为true
[[Enumerable]]:是否能够通过for-in的方式循环属性。默认true
[[Writeable]]:是否可以修改属性。默认true
[[Value]]:属性的数据值。默认undefined
例如:
var person = {
name:'tom'
};
[[Value]]特性被设置为’tom’
修改属性的默认特性:Object.defineProperty();
var person = {};
Object.defineProperty(person,'name',{
writeable:false,//属性不可写
value:'jack'
});
alert(person.name);//jack
person.name='greg';
alert(person.name);//jack
//对于configurable特性
var person = {};
Object.defineProperty(person,'name',{
configurable:false,
value:'tom'
});
alert(person.name);//tom
delete person.name;//因为configurabl=false,所以啥也不会发生,在严格模式下会报错的。
alert(person.name);//tom
注意:
1.configurable特性一旦设置为false,就不能改成true了,否则报错。
2.一旦调用Object.defineProperty()方法时,configurable、enumerable、writeable特性默认设置为false。
2.访问器属性
[[Configurable]]:默认为true
[[Enumerable]]:默认为true
[[Get]]:默认为undefined
[[Set]]:默认为undefined
访问器属性不能直接定义,只能使用Object.defineProperty()方法来定义。
var book = {
_year:2004,//一般下划线开头的属性,只能通过对象内部方法才能访问。
edition:1
};
Object.defineProperty(book,'year',{//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
*为对象定义多个属性:所有的属性在同一时间创建
Object.defineProperties();
example:
var book = {};
Object.defineProperties(book,{
_year:{//数据属性
writeable:true,
value:2004
},
edition:{//数据属性
writeable:true,
value:1
}
year:{//访问器属性
get:function(){
return this._year;
},
set:function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
三、读取属性的特性
Object.getOwnPropertyDescriptor();
example:
接前面book的例子。
var descriptor = Object.getOwnPropertyDescriptor(book,'_year');//数据属性
alert(descriptor.value);//2004
alert(descriptor.configurable);//false,因为调用了Object.defineProperty(),没有配置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'