日期:2014-05-16  浏览次数:20325 次

js面向对象学习7 继承

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? JS继承 ? ? ? ? ? ? ? ? ?

? ? ? ?所有开发者定义的类都可以作为基类,出于安全原因所有本地类,和宿主类 是不能作为基类使用的。

应为js 中所有的属性和方法都是公用的所以子类一旦继承父类就拥有了父类所有的属性和方法,而且可以为父类新增方法和属性,也可以覆盖父类的属性和方法。

? ? ? ?因为Emcascript中没有明确的指定继承方式,所有所有的继承都是模拟而来

对象冒充:

? ? ? 对象冒充是开发者在在函数中频繁的使用this关键字后出现的。原理如下:

构造函数使用this给所有的属性和方法赋值,因为构造函数只是一个函数,所有可以利用ClassA 的构造函数成为ClassB的方法,实现代码如下?

?

function ClassA(colora){
         this.color=colora;
         this.showColor=function(){
              console.log(this.color);
         }

}
function ClassB(colorb){
          this.newMethod=ClassA;
          this.newMethod(colorb);
          delete this.newMethod;

}

?

?这种继承方式也可以模式多重继承,在ClassB函数内 在指向一个新的引用就可以,但是这种方式存在了一个问题就是

当多重继承的时候多个跟类有同样名字的方法或者属性,后继承的会覆盖前继承的。

?

解疑: 此种形式我刚开始有点不解,为什么通过这种方式B就有color 和showColor 方法我试着用这种形式的代码改造了一下

?

?

function ClassB(colorb){

      this.newMethod=function(colorb){
              this.color=colorb;
              this.showColor=function(){
                    console.log(this.color);
              }
      }
      this.newMethod(colorb);
      delete this.newMethod;

}
?

?

?

?我感觉这种写法更能说明ClassB 的继承实现原理

Call 方法

? ? call()方法是与对象冒充最相似的方式,在emcascript 改进后function 新增了call() 和apply()两个方法,

? 在使用call 的时候第一个参数是this ,其他的参数则是直接专递给函数自身例如

?

function sayColor(prefix,suffix){
          console.log(prefix+"__color:"+this.color+"__"+suffix);//这里this就等于call传递过来o

}
var o=new Object();
o.color="red";
sayColor.call(o,"sb","ub");//这个o就相当于了sayColor 中this

? ? 如果是call()的方式改造上一个继承方式如下代码

?

function ClassB(colorb){
       ClassA.call(this,colorb);

}
?

?Apply方法

?

?