• 继承


      继承以实现多样性,使用开发者定义的“类”都可以作为基类被继承,当然,出于安全原因,本地“类”与宿主“类”不能作为基类被继承(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原型~

     

  • 相关阅读:
    linux top
    虚拟内存
    strcpy与strncpy
    C++ 踩内存
    MySQL -- 全文检索
    MySQL -- 全文检索(自然语言全文检索)
    MySQL -- innodb中cardinality是如何统计的
    MySQL -- Fast Index Creation
    python -- 生成器
    MySQL中模拟oracle中的rownum列
  • 原文地址:https://www.cnblogs.com/pada/p/3692429.html
Copyright © 2020-2023  润新知