对象是一种复合值,它将很多值聚合在一起,可以通过名字来访问这些值
对象也可以看做是属性的无序集合,每个属性都是一个键/值对,属性名是字符串
在javascript中,除了字符串、数字、true、false、null、和undefined之外,其他的值都是对象
我总结了三种创建对象的方式
——通过对象直接量创建
对象直接量是是由若干键/值对组成的映射表,键/值中间用冒号分隔键/值之间用逗号分隔
var empty = {}; //没有任何元素的空对象
var point = {x:0,y:0} //两个属性的对象
var point2 = {x:point.x,y:point.y} //引用别的对象的属性作为值得对象
var book = {
"main title":"javascript", //属性名有空格,必须用字符串表示
"sub-title":"Then Definitive Guide",//属性名有连字符,必须用字符串表示
"for":"all audiences", //“for”是保留字,必须用字符串表示
author:{ //这个属性值是一个对象
firstname:"David",
surname:"Flanagan"
}
}
——关键字new创建
new运算符创建并初始化一个新对象,关键字new后跟随一个函数调用,这个函数叫做构造函数,构造函数用于初始化一个新创建的对象
var o=new Object(); //创建一个新的空对象,相当于{}
var a= new Array(); //创建一个空数组,相当于[]
var d=new Date(); //创建一个当前时间的Date对象
——通过函数Object.create()创建
这是一个ECMAScript5方法,早期浏览器可能不支持,不过主流的浏览器都是支持了的
Object.create( )有个参数——要创建对象的原型
Object.create()是一个静态函数,不给任何对象调用 只需要传入参数就可以使用
var o=Object.create({x:1,y:2});
//新创建的o对象就继承了原型{x:1,y:2}对象
//所以o.x为1,o.y为2
可以通过传入参数null来创建一个没有原型的对象,但是通过传入null方式创建的对象不会继承任何基本方法,包括toString()
如果想创建一个具有基本方法的空对象,可以像这样干
var o = Object.create(Object.prototype);
下面写一个用于创建有原型的对象的工具函数,考虑了兼容性
function inherit(p){
if(p == null) throw TypeError();
if(Object.create) return Object.create(p);
var t = typeof(p);
if(t != "Object" || t !="function")
throw TypeError();
function f(){};
f.prototype = p;
return new f;
}
如果给继承对象的属性赋值,则这些对象的属性值会影响继承对象的本身,而不会影响原型对象