对象(Objects)

包括简单类型:number, string, boolean,null,undefined和对象类型两种。number, string, boolean类似对象类型,有自己的方法(method)但是是不可变的。在JavaScript中,数组(arrays)是对象、函数(function)是对象、正则表达式(regular expressions)是对象、对象(objects)是对象。

对象字面符(Object Literals)

对象是一个name/value对的集合,通过,分隔。name可以是任何字符串(包括空字符串),如果name是一个合法的JavaScript名字并且不是保留字,则可以不用引号包裹。

对象持有一个隐藏的链接指向原型对象,通过字面符号创建的对象链接指向Object.portotype

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
var empty_object = {};
var stooge = { 
	"first-name": "Jerome", 
	"last-name": "Howard"
};
var flight = {
	airline: "Oceanic", 
	number: 815, 
	departure: {
		IATA: "SYD",
		time: "2004-09-22 14:55", 
		city: "Sydney"
	}, 
	arrival: {
		IATA: "LAX",
		time: "2004-09-23 10:42",
    city: "Los Angeles"
	} 
};

获取值(Retrieval)

  • 下标方式

    1
    
    stooge["first-name"] // "Jerome"
  • .方式

    1
    
    flight.departure.IATA // "SYD"

如果试图访问一个存在的对象成员,则返回undefined。

1
2
3
stooge["middle-name"]   // undefined
flight.status           // undefined
stooge["FIRST-NAME"]    // undefined

试图从undefined获取值则会抛出(throw)一个TypeError异常,可以通过&&操作符来避免。

1
2
3
flight.equipment                           // undefined
flight.equipment.model                     // throw "TypeError"
flight.equipment && flight.equipment.model // undefined

更新值(Update)

如果属性/成员名已经存在则会更新,否则会为对象添加属性并赋值。

  • 下标方式

    1
    
    stooge['first-name'] = 'Jerome';
  • .方式

    1
    2
    3
    4
    5
    
    stooge.nickname = 'Curly'; 
    flight.equipment = {
    	model: 'Boeing 777' 
    };
    flight.status = 'overdue';

引用(Reference)

对象通过引用传递,不会进行拷贝。

1
2
3
4
5
6
7
8
9
var x = stooge; 
x.nickname = 'Curly';
var nick = stooge.nickname;   // Curly
var a =
nick = stooge.nickname;
// a, b, c 引用不同的空对象
var a = {}, b = {}, c = {};
// a, b, c 引用同一个空对象
var a = b = c = {};

原型(Prototype)

所有通过字面符号创建的对象都链接到了Object.prototype。在获取对象的值时,如果对象没有该属性,则会在原型链上逐级查找,直到Object.prototype,如果没有找到则返回undefined值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
if (typeof Object.create !== 'function') { 
	Object.create = function (o) {
		var F = function () {}; 
		F.prototype = o;
		return new F();
	};
}

var another_stooge = Object.create(stooge);

another_stooge['first-name'] = 'Harry'; 
another_stooge['middle-name'] = 'Moses'; 
another_stooge.nickname = 'Moe';

原型链关系是一种动态关系,当对原型对象添加属性或修改属性值时,基于该原型的对象将立即可见。

1
2
stooge.profession = 'actor'; 
another_stooge.profession // 'actor'

列举/遍历(Enumeration)

for in循环会遍历对象上的所有属性(包括原型对象上的)。

删除(Delete)

可以通过delete删除对象的属性,但是不能删除原型链对象的属性。

1
delete another_stooge.nickname;

减少全局变量(Global Abatement)

1
2
3
4
5
var MYAPP = {};
MYAPP.stooge = { 
	"first-name": "Joe", 
	"last-name": "Howard"
};