0.导论
定义:
在JS中,对象是可变的键控集合。
性质:
1、对象是无类别的,对新属性的名字和值没有约束。
2、对象可以包含其他对象。
3、对象可以继承另一对象的属性。
1.对象字面量
定义:
一个对象字面量就是包围在一对花括号中的零或多个“名/值”对。
属性名:
1、属性名可以是包括空字符串在内的任何字符串。
2、如果属性名是一个合法的标识符且不是保留字,则并不强制要求用引号括住属性名。
标识符命名规则:
1.以字母、下划线或者$符号开头
2.由字母、下划线、$符号和数字组成
var stooge = {
"first-name": "Jerome",
last_name: "Howard"
}
3、属性值可以从包括另一个对象字面量在内的任意表达式中获得。对象是可嵌套的:
var flight = {
airline: "Oceanic",
number: 815,
department: {
IATA: "SYD",
time: "2004-09-22 14:55",
city: "Sydney"
},
arrival: {
IATA: "LAX",
time: "2004-09-23 10:42",
city: "Los Angeles"
}
};
2.检索
1、可以采用[]后缀中括住一个字符串表达式的方式来检索对象包含的值。如果字符串表达式是一个常数,而且它是一个合法的JS标识符而非保留字,也可用“. 表示法”来代替。优先考虑“ . 表示法”。
stooge["first-name"]
flight.department.IATA
2、如果尝试检索一个并不存在的成员元素的值,将返回一个undefined值。
stooge["middle-name"] //undefined
flight.status //undefined
3、|| 运算符可以用来填充默认值。
var middle = stooge["middle-name"] || "(none)"
console.log(middle) //(none)
//原理:stooge["middle-name"]为false之后,middle则为(none)
4、当检索undefined值会导致TypeError异常。可以通过&& 运算符来避免报错。
flight.equipment //undefined
flight.equipment.model //throw"TypeError"
var test=flight.equipment && flight.equipment.model
console.log(test) //undefined
//原理:先检索flight.equipment,flase之后避免执行后面的而导致的报错
3.更新
1、对象中的值可以通过赋值语句来更新。
stooge['first-name'] = 'Jerome'
2、如果对象之前并没有那个属性名,则该属性就被扩充到该对象中。
var middle = stooge["middle-name"]
console.log(middle) //undefined
stooge["middle-name"] = 'Tom'
middle = stooge["middle-name"]
console.log(middle) //Tom
4.引用
对象通过引用来传递,对象的引用为地址引用。
var x = stooge;
x.nickname = 'Curly'
var nick = stooge.nickname
//nick为Curly
var a = {},b = {},c = {};
//a、b、c每个都引用不同的空对象
a = b = c = {};
//a、b、c都引用同一个空对象
5.原型
1、所有通过对象字面量创建的对象都连接到Object.prototype这个JS中标准的对象。
2、创建一个新对象时,可以选择某个对象作为它的原型。通过构建Object的beget方法创建一个使用原对象作为其原型的新对象。
if( typeof Object.beget !== 'function' ){
Object.beget = function(o){
var F =new Function(o) {}; //定义构造函数F
F.prototype = o; //将传入对象设置为F的原型
return new F(); //返回新实例
}
}
Object.beget方法是将内容保存到原型链中,有利于后续的继承。并且更具有灵活性。
3、当我们对某个对象做出改变时,不会触及到该对象的原型。
4、委托:原型连接只有在检索值的时候才会被用到。如果我们尝试去获取某个对象的某个属性值,且该对象没有此属性名,那么JS会试着从原型对象中获取属性值,依此类推,直到该过程到达终点Object.prototype。如果原型链中不存在,则结果为undefined。
5、原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立刻对所有基于该原型创建的对象可见。
6.反射
typeof操作符用来确定属性的类型。
typeof flight.number //'number'
typeof flight.arrival //'object'
typeof flight.manifest //'undefined'
并且原型链中的任何属性都会产生值。
typeof flight.toString //'function'
typeof flight.constructor //'function'
hasOwn方法不会检查原型链。
flight.hasOwnProperty('constructor') //false
7.枚举
for in可用来遍历一个对象中的所有属性名(包括原型链中的属性)。并且属性出现的顺序是不确定的。
创建一个数组并使用for语句可以避免发掘出原型链中的属性并能得到正确的顺序。
var i;
var properties = {
'first-name',
'middle-name',
'last-name',
'profession'
};
for (i=0;i < properties.length;i += 1){
document.writeln(properties[i] + ':' + another_stooge(properties[i]))
}
8.删除
delet运算符可以删除对象的属性,如果对象包含该属性,则该属性会被删除。
delete不触及原型链。
9.减少全局污染变量
把全局性的资源都纳入同一个名称空间之下,可以显著减少全局污染,并提高可读性。
var MYAPP = {}
MYAPP.stooge = {
'first-name': "Joe"
}
MYAPP.flight = {
airline: "Oceanic"
}