1.对象字面量
- 一个对象字面量就是包围在一对花括号中的零或多个“名/值”(key/value)
var a={};
- 属性名如果是非法的javascript标识符或保留字,需要为其加上引号
var person = {
age: 18,
nation: "hanzu",
"xing ming": "hanjinglong", //若属性名是非法字符串或保留字时,必须用引号括住
"first-name": "dasima",
family: { //对象是可嵌套的
mother: "xxx",
father: "yyy"
}
};
(每个名/值要用逗号隔开,最后一个名/值不用)
2.检索
1.检索方式
- 在[]后缀中括住一个字符串表达的方式
person[age] // 18
person[family[mother]] // xxx
- 如果字符串是合法的javascript标识符且并非保留字,也可以用.表示法代替。而且优先考虑使用该方法,因为它更紧凑且可读性好。
person.family.mother //xxx
2.默认值与运算符
- 当你尝试检索一个不存在的成员元素的值时,将返回一个undefined值。
person.ma //undefined
person.horse //undefined
person.family.horse //undefined
- ||或运算符可以用来填充默认值
var horse = person.horse || "(none)" //undefined
var king = person[king] || "unknown" //undefined
- 检索undefined值会导致TypeError异常。这可以通过&&并运算符来避免错误。
person.ma //undefined
person.ma.name //throw"TypeError"
person.ma && person.ma.name //undefined
3.更新
- 对象中的值可以通过赋值语句来更新。
3.1 如果属性名已经存在对象中,则属性值被替换
3.2 如果对象中没有该属性名,则对象扩充该属性
person.family.mother = "zzz"; //属性名mother的值被更新为zzz
person.ma = "king"; //新增属性名ma 属性值为king
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"
}