这篇文章主要是记录《JavaScript语言精粹》对象篇的笔记。
对象字面量
对象字面量提供了一种非常方便的创建对象值的表示法。属性名可以是包括空字符串在内的任何字符串,也可以是一个合法的javascript标识符且不是保留字。
检索
- 要检索对象里包含的值,可以采用在[]后缀中括住一个字符串表达式的方式,也可以用.表示法代替。优先考虑使用.表示法。如果检索一个并不存在的成员属性的值,将返回undefined。
- ||运算符可以用来填充默认值:
var middle=stooge["middle-name"] || "none"
- 从undefined的成员属性中取值将会导致TypeError异常,使用&&
fight.equipment // undefined
fight.equipment.model // throw "TypeError"
fight.equipment && fight.equipment.model // undefined
原型
每个对象都连接到一个原型对象,并且它可以从中继承属性。所有通过对象字面量创建的对象都连接到object.prototype。所以当你创建一个新对象的时候,可以选择某个对象作为它的原型,实现方式就是使用Object.create()
Object.create=function(o){
var F=function(){}
F.prototype=o
return new F()
}
var another_stooge=Object.create(stooge)
原型连接只有在检索的时候才被用到,如果获取对象的某个属性值,但该对象没有此属性名,那么将从原型链中获取,直到达到终点Object.prototype,如果属性完全不存在于原型链中,那么结果就是undefined。
反射
有两种方法去处理对象中不需要的属性(原型中的属性)
- 让程序去检查并丢弃值为函数的属性
typeof操作符检测属性
typeof fight.number // 'number'
原型链中的任何属性都会产生值
typeof fight.toString // 'function'
typeof fight.constructor // 'function'
- 用hasOwnProperty方法,对象拥有独有的属性,将会返回true
fight.hasOwnProperty('number') // true
fight.hasOwnProperty('constructor') // false
枚举
for in 语句可用来遍历一个对象中的所有属性名,包括函数和你可能不关心的原型中的属性,所以怎么过滤那些值呢:使用hasOwnProperty 或者使用typeof来排除函数,以下使用typeof方法来排除。
var name
for(name in another_stooge){
if(typeof another_stooge[name]!=='function'){
document.writteln(name+':'+another_stooge[name])
}
}
for in 遍历时,属性名出现的顺序是不确定的,如果要想确保属性名以特定的顺序出现,最好办法是避免使用for in 语句,而是创建一个数组,在其中以正确的顺序包含属性名
var i;
var properties=[
'first-name',
'middle-name',
'last-name',
'profession'
]
for(i=0;i<properties.length;i++){
document.writln(properties[i]+':'+another_stooge[properties[i]])
}
删除
delete运算符可以用来删除对象的属性,如果对象包含该属性,那么就会被删除,它不会触及原型链中的任何对象。删除对象的属性,可能会让原型链中的属性透视出来。
减少全局变量污染
JavaScript可以很随意地定义全局变量来容纳你的应用中的所有资源,但是全局变量削弱了程序的灵活性,应该避免使用。最小化使用全局变量的方法之一是你为你的应用只创建一个唯一的全局变量。
var MYAPP={}
MYAPP.stooge={
'first-name':'JOE'
}
MYAPP.flight={
airline:'Oceanic',
number:815,
departure:{
time:"2004-09-22",
city:"Sydney"
}
}
把全局性的资源都纳入一个名称空间下,你的程序与其他应用程序、组件或类库之间发生冲突的可能性就会显著降低。你的程序也会变得更加容易阅读。