对象是javascript的基本数据类型。对象是一种复合值:它将很多值聚合在一起。
对象不仅仅是字符串到值的映射,除了可以保持自由的属性,还可以从一个成为原型的对象继承属相。
对象是动态的,可以新增和删除属性。
对象是可变的,通过引用而非值来操作对象。如果变量x是指向一个对象的引用,那么执行代码var y = x 变量y指向同一个对象的引用,而非这个对象的副本,通过变量y修改这个对象也会对变量x造成影响。
对象最常用的用法是 :创建、设置、查找、删除、检测、枚举。
创建对象
创建对象可以通过对象直接量、关键字new 和 (ECMAScript5
)obiect.create()函数来创建对象。
对象直接量:
创建对象最简单的方式,对象直接量是由若干名/值对组成的映射表。
var empty = {};//没有任何属性的对象
var point = {x:0,y:0};//两个属性
对象的属性名字里面如果有空格,必须用字符串表示。 "main title" : "hao123";
对象直接量是一个表达式,每次运算都创建并初始化一个新的对象,每次计算对象直接量的时候,也都会计算他的每个属性的值。
用过new创建对象:
new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用(函数成为构造函数)。
var 0 = new Object();
用自定义构造函数类初始化对象是非常常见的。
Obiect.create()
原型:
每一个javascript对象都和另一个对象相关联,另一个对象就是原型,每一个对象都从原型继承属性。
所有通过对象直接量创建的对象都具有同一个原型,可以通过Obiect.prototype获得对原型对象的引用。
用过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值:
通过new Object.create()创建对象继承Object.prototype.
通过new Array()创建的对象的原型是Array.prototype。
Object.create()创建新对象,第一个参数是这个对象的原型。第二个参数可选,用以对对象的属相进行进一步描述。
var o =Object.create({x:1,y:2});//O继承了属性x和y
可以通过传入参数null来创建一个没有原型的新对象,但是这种方式创建的对象不会继承任何东西,甚至不包括基础方法,比如toString().
var o2 = Object.create(null);//o2不继承任何属性和方法。
删除属性
delete运算符可以删除对象的属性,操作数应当是一个属性访问表达式。
delete book.author;//book对象不再有属性author
delete运算符只能删除自有属性,不能删除继承属性。
delete表达式删除成功或没有任何副作用(比如删除不存在的属性)时,返回true。
delete不能删除那些可配置属性为false的属性。不能删除 var定义的变量和函数(function).
检测属性
javascript对象可以看做属性的集合,判断某个属性是否存在某个对象,可以通过 in运算符,hasOwnPreperty()和propertyIsEnumerable()方法判断。
in运算符左侧是属性名,右侧是对象,如果是对象的自有属性或继承属性返回true。
对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。
对象的propertyIsEnumerable()方法用来检测给定的名字是否是对象的自有属性并且这个属性的可枚举性为true时返回true。
对象的propertyIsEnumerable()方法用来检测给定的名字是否是对象的自有属性并且这个属性的可枚举性为true时返回true。
属性getter和setter
对象属性是由名字、值和一组特性构成,在ECMAScript5中,属性值可以用一个或两个方法代替,这两个方法就是getter和setter,称为:存取器属性,不同于数据属性,数据属性只有一个简单的值。
当程序查询存取器属性的值时,调用getter方法(无参数),方法的返回值就是属性存取表达式的值,当程序设置一个存取器属性的值时,调用setter方法,将赋值表达式右侧的值当做参数传入setter,可以忽略setter方法的返回值。
var p = {
x = 1,
y = 1,//x和y是普通的可读取的数据属性
//r是可读取的存取器属性,函数体结束后要带上逗号
get r(){return Math.sqrt(this.x *this.x+this.y*this.y);},
set r(newvalue){
var oldvalue = Math.sqrt(this.x*this.x+this.y*this.y);
var ratio = newvalue/oldvalue;
this.x *=ratio;
this.y *=ratio;
},
//theta是只读存取器属性
get theta(){ raturn Math.atan2(this.y,this.x);}
};
p.x= 2,p.y = 2;
console.log(p.r);
console.log(p.theta);
序列化对象
对象序列化是指将对象转换为字符串,也可将字符串还原为对象。ECMAScript5提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原javascript对象,这些方法使用JSON作为数据交换格式。
o = {x:1,y:{z:[false,null,""]}};//定义一个对象
s= JSON.stringify(o);
p = JSON.parse(s);
ECMAScript5中的这些函数的本地实现和 http://json.org中json2.js中的公共域ECMAScript3版本的实现类似,可以通过引入json2.js模块在ECMAScript3的环境中使用ECMAScript5的这些函数。