可以通过.
或[]
运算符来获取属性的值,两者完全等价。
对于.
来说,右侧必须是属性名称的简单标识符。
对于[]
来说,右侧可以是表达式,但表达式结果必须是字符串或者可以自动转换为字符串的值。
var author = Book.author
var year = Book['year']
也可以通过.
和[]
给属性赋值
Book.author = {name:'Mike', age:'38'}
Book['year'] = 2011
关联数组
可以看出[]
的访问方式与数组类似,区别就是数组是使用数字作为索引,对象使用字符串作为索引。
使用字符串作为索引的数组成为关联数组,也成为散列、映射或字典。Javascript对象都是关联数组。
[]
在动态建立属性时比.
更具有灵活性,如下功能使用.
就无法实现:
//将客户的多个地址合并
var addr = ''
for(i=0;i<4;i++){
addr += customer['address'+i]+'\n'
}
例如,股票系统中,因为实现无法直到客户买什么股票,可以通过动态添加属性的方式来实现该功能
//用holding对象保存持仓股票
function buyStock(holding,stockname,shares){
holding[stockname] = shares
}
练习:如何计算股票总价值? 使用for/in
继承
Javascript对象的属性分为自有属性和继承属性(从原型对象继承)。
属性读取:
Javascript对象查找属性按照以下原则进行:假设查询o的属性x,如果o没有x属性,就在o的原型对象中查找x属性;如果o的原型对象也没有x属性,就继续查找原型对象的原型的属性,直到找到x或者原型为null位置。可以看出这个过程是一个链式查找的过程,这个链成为原型链
属性赋值:
属性赋值操作,总是在原始对象上创建或修改属性,不会去修改原型链。
如果对象o已经包含属性x,则直接修改属性x的值;如果o没有属性x,则给o添加x属性并赋值。如果o的原型对象有属性x,赋值会覆盖该属性,但不会改变原型对象x的值。即o和原型对象各自有x属性,值互不干扰,o.x和o.proto.x可以不同。
Javascript中,只有在查询属性时才有继承存在,设置属性和继承无关。
var o={}
o.x = 1
var p = Object.create(o)
p.y = 2
var q = Object.create(p)
q.z = 3
console.log(q.x+q.y+q.z) //6
p.a = 9
console.log(q.a) //9
属性访问错误
访问对象不存在的属性并不会报错,会得到
undefined
。但如果对象不存在,就会报错,可用if(o)
这种形式避免错误。
var len
if(book&&book.title&&book.title.length){ //利用了&&的短路运算
len = book.title.length
}
以下情况属性赋值会失败:
- 属性是只读的,不管是自有属性还是继承属性。
- 对象的可扩展性是false,而且原型链中也没有该属性。
网友评论