javascript中继承是通过原型实现的,对象的属性可以分为自有属性和继承属性,下面我简单介绍一下属性的访问规则。
访问
访问obj.x,属性访问规则是:
- 查找obj是否有x属性。
- 若没有,继续在obj的原型中继续查找x。
- 以此向上查询,知道找到x或者找到一个原型是null的对象为止。
- 都未找到则返回undefined
赋值
例如obj.x = ‘haha’,赋值规则是:
- obj中已有属性x,直接修改x的值。
- 如果obj中的属性x,继承自原型,那么在obj创建同名属性覆盖原型,但不会修改原型。
- 不是前面的情况,则给obj添加一个新属性x。
javascript中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关,让程序员可以有选择地覆盖继承的属性。
|
|
上面的情况会修改原型上的a的值,由于上述操作实际完成了两步,先访问了原型上的a属性,然后进行操作,修改了原型上的值。
属性检测
三种方式可以使用:
key in obj: 判断范围包括自有属性或继承属性,忽略判断是否可枚举hasOwnProperty(): 判断范围只有自有属性,忽略是否可枚举propertyIsEnumerable(): 判断范围自有属性,必须满足可枚举
属性遍历可以通过for/in,遍历所有可枚举的属性(自有属性和继承属性);Object.keys(),返回可枚举的自有属性;Object.getOwnPropertyNames(),返回全部自有属性。