Js对象

来源:互联网 发布:java时间加一秒 编辑:程序博客网 时间:2024/05/31 13:16

1.怎么创建对象?

早起Js开发人员创建对象的模式:

var person = new Object();person.name = "ZhangSan";person.age = 22;person.job = "Soft Engineer";person.sayName = function(){alert(this.name);}

用对象字面量的模式创建对象:

var person = {name:"LiSi", age:22, job:"Soft Engineer", sayName:function(){ alert(this.name); }};
2.属性类型

ECMAScript中有两种属性:数据属性和访问器属性。

数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。

[Configurable]:表示能否通过delete删除属性从而重新定义属性,能够修改属性的特性,或者能否把属性修改为访问器属性。默认是true。

[Enumerable]:表示能否通过for-in循环返回属性。默认是true。

[Writable]:表示能否修改属性的值。默认是true。

[Value]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存到这个位置。默认是undefined。

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

一旦把属性定义为不可配置的,就不能再把它变回可配置的了。此时,再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。

访问器属性不包含数据值,它们包含一对儿getter和setter函数,这两个函数都不是必需的。在读取访问器属性时,会调用getter函数;在写入访问器属性时,会调用setter函数并传入新值。访问器属性有4个特性。

[Configurable]:表示能否通过delete删除属性从而重新定义属性,能够修改属性的特性,或者能否把属性修改为数据属性。默认是true。

[Enumerable]:表示能否通过for-in循环返回属性。默认是true。

[Get]:在读取属性时调用的函数。默认是undefined。

[Set]:在写入属性时调用的函数。默认是undefined。

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

只指定getter意味着属性只能读不能写,尝试写入属性会被忽略;只指定setter意味着属性只能写不能读。

3.读取属性的特性

使用ECMAScripte5的Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称。

4.创建对象

虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。

工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程,考虑到ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。

function createPerson(name,age,job){var o = new Object();o.name = name;o.age = age;o.job = job;o.sayName = function(){alert(this.name);};return o;}var person1 = createPerson("Steve Jobs",22,"Soft Engineer");
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题,即怎样知道一个对象的类型。

构造函数模式
ECMAScript中的构造函数用来创建特定类型的对象,像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中。此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。上面的例子可以这样改写:

function Person(name,age,job){this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);};}var person3 = new Person("Tim Cook",33,"CEO");

原型模式

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途就是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面的意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必再构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。如下面的例子所示:

function Person(){Person.prototype.name = "Steve Jobs";Person.prototype.age = 26;Person.prototype.job = "CTO";Person.prototype.sayName = function(){alert(this.name);}};
原型模式产生的所有实例属性和方法都是一致的。

5.String对象

属性:length,prototype

方法:parseInt,parseFloat,charAt,charCodeAt,concat,indexOf(某个字符串值在字符串中首次出现的位置),lastIndexOf,replace,slice(start,end),split(把字符串分隔成字符串数组),substr(从起始索引号提取字符串中指定数目的字符),substring(截取从start开始到end之间的字符,和slice作用一致),toLowerCase,toUpperCase,toString(返回字符串)

6.Array对象

创建数组:var arr = new Array();

对象字面量:var arr = [1,2,3,4,5];

属性:length,prototype

方法:concat(连接两个或更多的数组),join(把数组中的所有元素放入一个字符串,元素通过指定的分隔符进行分隔),pop(删除并返回数组中的最后一个元素),push(向数组的末尾添加一个或更多元素,并返回新的长度),unshift(向数组的开头添加一个或更多元素,并返回新的长度),reverse(颠倒数组中元素的顺序),shift(删除并返回数组的第一个元素),slice(从某个已有的数组返回选定的元素),splice(index,howmatch,element;删除元素,并向数组添加新元素),sort(数组排序)


0 0