码迷,mamicode.com
首页 > 编程语言 > 详细

javascript第3版(高级程序设计)第6章:面向对象的程序设计

时间:2015-07-20 16:08:12      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

/**

 * 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,writablevalue,设置其中一个或

 

者多个值,可以修改对应特性值,如

//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()方法修改同个属性,但在把configurablefalse之后有限制了

//在调用Object.defineProperty()方法,如果不指定,configurableenumerablewritable特性默

 

认值都是false,多数情况下,

//Object.defineProperty()方法方法提供了这些高级特性

//访问器属性

/*访问属性不包含数据值,它们包含一对儿gettersetter函数(但这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个默认属性:_yearedition;

//_year前面的下划线是一种常用记号,用于表示只能通过对象方法访问属性,而访问器属性year则包

 

含一个gettersetter函数

//getter函数返回_year值,setter函数通过睐确定正确的版本,把

//year的值改为2005,那么_year也将变成2005edition变成2,这个就是常用的访问器属性

/*不一定非要同时指定gettersetter,只指定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,writablevalue,如下

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!