标签:
/**
* Created by Administrator on 2015/7/20 0020.
*/
//面向对象(oo):通过类可以创建任意多个具有相同属性和方法对象
//js把对象定义为:无序属性的集合,其属性可以包含基本值,对象或者函数,严格来说,就相当于说
对象是一组没有特定顺序值,对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值
//理解对象
//创建一个对象实例
var peson=new Object();
peson.name=‘Nichols‘;
peson.age=29;
peson.job=‘Software Engineer‘;
peson.sayName=function(){
alert(this.name)
};
//创建一个名为peson对象,并添加几个属性.name,.age,.job,和一个方法.sayName
//sayName()方法用于显示this.name的值,现在通过以下代码方式
var peson={
name:‘Nichols‘,
age:29,
job:‘Software Engineer‘,
sayName:function(){
alert(this.name);
}
};
//属性类型:数据属性和访问器属性
/*数据属性
* 包含一个数据值的位置,在这个位置可读可写,有4个描述行为
* [Configurable]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能
否把属性修改为访问器属性,默认值为true
* [Enumerable]:表示能否通过for-in循环返回属性,默认值为true
* [Writable]:表示能否修改属性,默认值为true
* [Value]:包含这个属性的数据值,读取属性的值时候,从这个位置读;写入属性值的时候,把新值
保存在这个位置,默认值为undefined*/
var peson={
name:‘Nichols‘
};
//创建一个名为name属性,为它指定值:Nichols,也就是说:[value]特性将被设置为Nichols,而对
这个值任何修改都将反映在这个位置
//要修改默认特性:Object.defineProperty()方法,它接受3个参数:属性所在对象,名字,和一个描
述符对象
//描述符(descriptor)对象属性必须是configurable,emumerable,writable的value,设置其中一个或
者多个值,可以修改对应特性值,如
//var peson={};
//Object.defineProperty(peson,‘Name‘,{writable:false,
//value:‘Nichols‘});//创建一个name属性,它的值是Nichols只读的,不可修改的
//alert(peson.name);//undefined
//peson.name=‘Greg‘;
//alert(peson.name);//Greg
//也可以使用如下规则(不修改属性)
var peson={};
Object.defineProperty(peson,‘Name‘,{configurable:false,
value:‘Nichols‘});
//alert(peson.name);//undefined
//peson.name=‘Greg‘;
//alert(peson.name);//Greg
//configurable:false,表示不能从对象中删除属性,如果对这个属性调用delete,则在严格模式下什
么都不会发生,在严格模式下会导致错误
Object.defineProperty(peson,‘Name‘,{configurable:true,
value:‘Nichols‘});//这样修改,会导致错误
//Object.defineProperty()方法修改同个属性,但在把configurable为false之后有限制了
//在调用Object.defineProperty()方法,如果不指定,configurable、enumerable和writable特性默
认值都是false,多数情况下,
//Object.defineProperty()方法方法提供了这些高级特性
//访问器属性
/*访问属性不包含数据值,它们包含一对儿getter和setter函数(但这2个属性都不是必需的)
* 在读取访问器属性时,会调用getter属性,这个函数负责返回有效的值,在写入访问属性时,会调用
setter函数并传入新值,如何处理属性,如下
* [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(
value
){if(value>200){
this._year=value;
this.edition+=value-2004
}}
});
//book.year=2005;
//alert(book.edition);
//创建一个对象名为book对象,定义了2个默认属性:_year和edition;
//_year前面的下划线是一种常用记号,用于表示只能通过对象方法访问属性,而访问器属性year则包
含一个getter和setter函数
//getter函数返回_year值,setter函数通过睐确定正确的版本,把
//year的值改为2005,那么_year也将变成2005,edition变成2,这个就是常用的访问器属性
/*不一定非要同时指定getter和setter,只指定getter意味着属性不能写,尝试写入属性会被忽略
* 在严格栻上,写入只指定了getter函数会出现错误,类似的setter属性也不能读取
* 要创建访问属性,一般用2个非标准方法
* __definGetter__()和__defineSetter__(),例子*/
var book={_year:2004,edition:1};
//定义访问器旧有属性
book.__defineGetter__(‘year‘,function(){
return this._year;
});
book.__defineSetter__(‘year‘,function(value){
if(value>2004){
this._year=value;
this.edition+=value-2004
}
});
book.year=2005;
alert(book.edition);
//定义多个属性
//Object.defineProperties():可以定义多个属性,接受2个参数:第一个对象是要添加和修改属性的
对象,第二个对象的属性与第一个对象中添加或者修改属性一一对应,如下
var book={};
Object.defineProperties(book,{
_year:{
value:2004
},edition:{
value:1
},year:{
get:function(){
return this._year
},
set:function(value){
if(value>2004){
this._year=value;
this.edition+=value-2004
}
}
}
});
//读取属性的特性,Object.defineProperties()方法,可以取得给定属性的描述符,它接受2个参数:
所在在对象和要读取描述秘名称,返回值是一个对象,如果是访问器属性,这个对象有
//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(value){
if(value>2004){
this._year=value;
this.edition+=value-2004
}
}
}
});
var descript=Object.getOwnPropertyDescriptor(book,‘_year‘);
alert(descript.value);//2004
alert(descript.configurable);//false
alert(typeof descript.get);//‘undefined‘
var descripts=Object.getOwnPropertyDescriptor(book,‘year‘);
alert(descripts.value);//undefined
alert(descripts.enumerable);//false
alert(typeof descripts.get);//‘function‘
javascript第3版(高级程序设计)第6章:面向对象的程序设计
标签:
原文地址:http://www.cnblogs.com/mhxy13867806343/p/4661351.html