对象属性的查询和设置
访问对象的两种方法
object.property 第一种语法使用点运算符和一个标识符
object["property"] 第二种语法使用一个方括号加字符串, (这样看起来很像数组,只是这个数组是通过字符串索引,而不是数字索引) 这种数组就是我们说的关联数组,也称作散列,映射,或则字典
注意javascript 中对象都是关联数组
由于javascript是弱类型语言,所以在任何对象中都可以创建任意数量的属性,但是通过点(.)运算符来访问对象的属性时,属性名需要用一个标识符来表示,标识符必须是出现在javascript程序中它们不是数据类型,因此无法修改他们。但通过 [ ] 来访问对象的属性时,属性名通过字符串表示。字符串时javascript的数据类型,在程序运行可以修改和创建他们,因此可以在javascript中使用下面这种代码
var address =""; for ( i=0; i<4;i++){ addr +=customer[ "address" + i] +'\n'; } //这段代码读取 customer对象的 address0 , address 1.。。。。并将他们联系起来
这个例子主要说明 使用数组写法和字符串表达式来访问对象的属性的灵活性。这段代码也可以通过点运算符来重写,但是很多场景中只能使用数组写法来完成
对象的继承
javascript对象具有自由属性,也有一些属性是从原型对象继承而来的,
假设我们有个对象 o 和属性 x 当我们查询对象 o 的 x 属性,如果 o 中不存在 x 属性 ,那么将会继续在 o 的原型的对象中查询属性 x 。如果原型对象上也没有,但这个原型也有原型,那么继续在这个原型对象上的原型上执行查询知道找到 x 或者查找到一个原型是 null 的对象。可以看到对象的原型属性构成了一个链,通过这个链可以实现属性的继承。
现在假设对象o的属性x赋值,如果o中已经有属性x(这个属性不是继承来的)那么这个赋值操作只能改变 这个已有属性的值,如果o中不存在属性x,那么赋值操作o添加一个新的属性x、如果之前o继承自属性x,如果o继承的自属性x 那么这个继承属性就被新创建的同名的属性覆盖了
注:赋值操作首先检查原型链,以此来判断是否允许赋值操作