上QQ阅读APP看书,第一时间看更新
7.5 对象的属性不可以继承
属性不可继承指的是,如果对象有多个层次,那么父子对象里的属性不可以相互继承和调用。我们来看下面的例子。
function logV(){ console.log(this.v); } var obj = {v:1}; obj.sonObj = {}; obj.logV = logV; obj.sonObj.logV = logV; obj.logV(); //1 obj.sonObj.logV(); //undefined
这个例子中,首先定义了一个obj对象和obj的子对象sonObj, obj有一个属性v, sonObj没有自己的属性,然后将logV方法分别关联到两个对象,接着分别调用它们的logV方法,最后obj可以打印出v,而obj.sonObj找不到v,结果会打印出undefined,这就说明obj.sonObj不可以调用obj中的属性。因此,在使用我们的原则时,一定要记住谁直接调用了方法this就指向谁,一定是直接调用而不是在调用链上出现过。
对象和属性的关系就像一台机器中组件和零件的关系,可以装配其他零件的东西叫作组件,而装配到组件上的东西可能还是组件,但父组件上面并不会直接装配子组件上的零件。例如将水杯放到背包里,那么背包就是个组件,然后又将背包放到车里,这时车就成了组件(或者叫父组件,相对于车这个组件来说)背包就成了零件(也可以叫子组件),要从车里直接拿水杯是拿不到的,水杯是子组件背包的零件而不是父组件车的零件,只有先从车里拿到背包,然后才能从背包里拿到水杯,同样要想从背包里拿车上放着的光盘也是拿不到的。
嵌套对象的作用主要是便于维护,就好像将杂七杂八的东西都分类放到各种各样的小盒子里面,然后再将小盒子分类放到大盒子里,最后将所有大盒子都放到箱子里,这样维护和使用起来就都方便了。有的资料会将这种嵌套对象叫作“命名空间”或者“包”,无论叫什么我们只要理解其本质就可以了。当然,在遇到那种叫法的时候我们也要明白别人说的其实就是嵌套对象。