JavaScript高级程序设计(面向对象的程序设计)

来源:互联网 发布:航拍视频软件 编辑:程序博客网 时间:2024/04/29 18:46

6.1理解函数

var person={    name:"Nicholas",    age:29,    job:"software engineer",    sayName:function() {      alert(this.name);    }  }

为对象添加属性以及方法。

6.1.1属性类型
ECMAScript中有两种属性:数据属性和访问器属性。
这里写图片描述

要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法可以接收三个参数:属性所在的对象,属性的名字,一个描述符对象。其中,描述符对象的属性必须是:configurable,enumerable,writable和value。设置其中的一或多个值,可以修改对应的特性值。例如:

var person={};    Object.defineProperty(        person,"name",        {writable:false,            value:"Nicholas"        });    alert(person.name);//Nicholas    person.name="Greg";    alert(person.name);//Nicholas

这个例子创建了一个名为name的属性,它的值“Nicholas”是只读的。这个属性的值是不可修改的。如果尝试为它指定新值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导致抛出错误。
类似的规则也适用于不可配置的属性。例如:

var person={};    Object.defineProperty(        person,"name",        {            configurable:false;            value:"Nicholas"        });    alert(person.name);//Nicholas    delete person.name;    alert(person.name);//Nicholas

把configurable设置为false,表示不能从对象中删除属性。如果对这个属性调用delete,则在非严格模式下什么也不会发生,而在严格模式下会导致错误。而且,一旦把属性定义为不可配置的,就不能把它变为可配置的。此时,再调用Object.defineProperty()方法修改除writable之外的特性都会导致错误。

也就是说,可以多次调用Object.defineProperty()方法修改同一个属性,但在把configurable特性设置为false之后就会有限制。
在调用Object.defineProperty()方法时,如果不指定,configurable、enumerable和writable特性的默认值都是false.多数情况下,可能都没有必要利用Object.defineProperty()方法提供的这些高级功能。

建议不要在ie8使用object.defineProperty()方法。

2.访问器属性
访问器属性不包含数据值;它们包含一对getter和setter函数(不过这两个函数都不是必须的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据,访问器属性有如下4个特性。
这里写图片描述

这里写图片描述

这里写图片描述

6.1.2 定义多个属性
由于为对象定义多个属性的可能性很大。ECMAScript5又定义了一个object.defineProperties()方法。利用这个方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。例如:

var book={};    Object.defineProperties(book,{        _year:{            value:2004        },        edition:{            value:1        },        year:{            get:function(){                return this._year;            }            set:function(newValue){                if(newValue>2004){                    this._year=newValue;                    this.edition+=newValue-2004;                }            }        }    })

这里写图片描述

6.1.3读取属性的特性
这里写图片描述

这里写图片描述
这里写图片描述

6.2创建对象
这里写图片描述

函数createPerson()函数能够根据接受的参数来构建一个包含所有必要信息的person对象。可以无数次地调用这个函数,而每次它都会返回一个包含三个属性一个方法的对象。

6.2.2构造函数模式

这里写图片描述

这里写图片描述

阅读全文
0 0
原创粉丝点击