前面两篇讲解了对象的概念和创建方式 JavaScript 对象学习笔记(上)、Object.create()方法和对象属性访问、设置 JavaScript 对象学习笔记(中)。
上篇提到:
object.property;//使用点运算符访问对象属性
object["property"]//使用中括号标识符访问对象属性
这两个表达式的值是相同的
第一种语法使用点运算符和一个标识符,这和C语言和Java语言访问一个结构体或者对象的静态字段非常相似。第二种方式看起来更像是数组,只是这种数组元素是通过字符串索引而不是数字索引。这种数组就是关联数组(associative array),JavaScript中的对象都是关联数组。当通过 [] 来访问对象的属性时。属性名通过字符串来表示,字符串是JavaScript的数据类型,在程序云的的时候可以修改和创建它们。
var customer = {
address0 : "china",
address1 : "guangdong",
address2 : "guangzhou",
address3 : "yuexiu"
};//定义一个对象
var addr = ""//用来储存遍历对象的属性值
for(var i = 0; i < 4; i++){
addr += customer["address" + i] + '\t';//动态访问对象的属性值
}
console.log(addr);//china guangdong guangzhou yuexiu
对象继承
JavaScript对象具有”自有属性”(own property),也有一些属性是从原型对象继承而来的本篇中会使用到 inherit() 函数,可以查看JavaScript 对象学习笔记(中)和 JavaScript prototype学习笔记 了解 inherit() 函数和 prototype 属性。
假如要查询对象obj中的属性attr,如果obj中不存在attr,那么将会在obj的原型对象中查询attr,如果原型对象中也没有的attr属性的话,但是这个原型对象也有原型,那么继续在在这个原型对象的原型上查询,直到找到attr或者查找到一个原型对象是null的对象为止,对象的原型对象构成了一个“链”,通过这个“链”可以实现属性的继承。
var obj = {}//obj从Object.prototype继承对象的方法
obj.attr = 1;//obj定义一个属性attr
var p = inherit(obj);//p继承obj和Object.prototype
p.x = 2;//p定义一个属性x
var q = inherit(p);//q继承p和Object.prototype、obj
q.z = 3;//q定义一个属性z
var str = q.toString();//toString继承自Object.prototype
console.log("q-->" + q.attr + q.x);//q-->12
对象q结构:
跟着上面的例子,假设给对象obj的属性attr赋值,如果obj中已经有了attr属性(这个属性是自有属性),那么这个赋值只会改变这个已有的attr属性,如果obj中不存在attr属性,那么赋值操作会给obj对象添加一个新的属性attr,如果之前obj继承自attr属性,那么继承的attr属性将会被新创建的同名属性覆盖。
var unitcircle = {r : 1};//用来继承的属性
var obj = inherit(unitcircle);//obj继承属性r
c.x = 1; c.y = 2;//定义两个属性
c.r = 3;//c覆盖继承来的属性
c.r;//3
unitcircle.r;//1,原型对象的属性没有改变