继承

  继承以实现多样性,使用开发者定义的“类”都可以作为基类被继承,当然,出于安全原因,本地“类”与宿主“类”不能作为基类被继承(ECMAScript中没有类这个定义,只有对象,所以这里的“类”是打了引号的)

  本地“类”—ECMA-262定义的类(引用类型),它们包括:

Object,Function,Array,String,Boolean,Number,Date,RegExp,Error,EvalError,RangeError,ReferenceError,SyntacError,TypeError,URIError

  宿主“类”—浏览器(宿主环境)提供的对象,它们有:

navigatior,document,windows,location,history

继承方式

  1.对象冒充

    通过构造函数使用this关键词给属性和方法赋值(利用了this灵活的指向当前的执行对象的性质)。

    function Person1(sName){ 

      this.name = sName;

      this.say = function () {  

        alert(this.name);

      };

    }

   function Person2(sName){

    this.Method = Person1;

    this.Method(sName);

    delete this.Method;  //删除对Person1的引用

   }

   对象冒充支持多重继承,但是如果继承的两个基类有相同的属性与方法,后继承的会覆盖先继承的~

   function ClassC(){

    this.Method = ClassA;

    this.Method();

    delete this.Method;  //删除对ClassA的引用

 

    this.Method = ClassB;

    this.Method();

    delete this.Method;   //删除对ClassB的引用

   }

  为了解决覆盖问题,ECMAScript第三版中,Function增加了方法call(),apply()

  2.call方法

    call()的第一个参数为this对象,其余参数传递给函数本身,成为函数的参数。

    function saySth(sStr1,sStr2){

      alert(sStr1 + this.str + sStr2);

    }

    var obj = new Object();

    obj.str = "Hey";

    saySth.call(obj,"Say:",",yo man!");  // "Say:Hey,yo man!"

 

  与对象冒充法一起使用~

   function Person2(sName,sSex){

    Person1.call(this,sName);

    this.sex = sSex;

    this.saySex = function(){

      alert("I'm a " + this.sSex);

    };

  }

  3.apply方法

    apply()有2个参数,第一个为this对象,第二个为传递给函数的数组。

    function saySth(sStr1,sStr2){

      alert(sStr1 + this.str + sStr2);

    }

    var obj = new Object();

    obj.str = "Hey";

    saySth.call(obj,new Array("Say:",",yo man!"));  // "Say:Hey,yo man!"

 

    与对象冒充法一起使用~

   function Person2(sName,sSex){

    Person1.apply(this,arguments);

    this.sex = sSex;

    this.saySex = function(){

      alert("I'm a " + this.sSex);

    };

  }

  4.原型链

     function Person(){}

     Person.prototype.name = "Pada";

     Person.prototype.say = function(){

        alert("My name is " + this.name);

     };

     function Person2(){}

     Person2.prototype = new Person();

    注意,子类的所有属性和方法都必需定义在prototype属性被赋值之后,因为当prototype属性定义后,原型指向发生改变,原始对象将被销毁~也因此,原型链方法不支持多重继承~

  5.混合方式

    综上所述,对象冒充必需使用构造函数,而使用原型链实现继承却无法使用带参的构造函数,因此我们可以将二者混合使用,用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。

 

       function Person(sName) {

      this.name = sName;

       }

     Person.prototype.say = function () {

        alert("My name is " + this.name);

     };

     function Person2 (sName,sSex) {

        Person.call(this, sName);

        this.sex = sSex;

     }

     Person2.prototype = new Person();

     Person2.prototype.saySex = function(){

      alert("I'm a " + this.sSex);

    };

    欲了解更多关于原型链详情,请移步:JS原型~

 

 

posted @ 2014-04-26 21:12  Pada  阅读(163)  评论(0编辑  收藏  举报