Javascript学习笔记——6.2 属性的访问和赋值

可以通过.[]运算符来获取属性的值,两者完全等价。

对于.来说,右侧必须是属性名称的简单标识符。
对于[]来说,右侧可以是表达式,但表达式结果必须是字符串或者可以自动转换为字符串的值。

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,而且原型链中也没有该属性。

你可能感兴趣的:(Javascript学习笔记——6.2 属性的访问和赋值)