zoukankan      html  css  js  c++  java
  • 继承

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

     

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/pada/p/3692429.html
Copyright © 2011-2022 走看看