• javascript 继承方法总结


    实际真正算起来js中继承的方法也就三种,下面一一说明

    第一种:原型链继承

    先说原型继承的语句,newFunction.prototype=new oldFunction()

    很简单就是将基函数的一个实例赋给新函数的原型,这种继承方法可以说是直接,简单,有效,基函数中的所有属性方法都可以被继承,推荐使用.

    不过这种方法也有不足,比如说当基函数中的属性有一个是动态属性的时候,oldFunction.arr=[“lirongfei”,”yangdanping”];当继承这个基函数后,所有的新函数都会包含一样的arr属性,特别是当你arr.push()新值的时候,所有的新函数的arr属性都是一样的.因为你改变的是所有新函数所共有的原型对象

    总结一点:原型链继承方法,使用,但由于原型实例共享的特点,所以当基函数中包含有动态属性(比如数组)时,而且你要根据不同实时改变时,就不能用这种方法继承了

    第二种:构造函数继承

    先说构造函数继承的语句:

           function newFunction(){

                  oldFunction.call(this,[“canshu1”,”canshu2”,…]);

           }

    第二种方法对那些只包含属性的基函数,很实用,首选,但是如果基函数中包含方法属性,就不推荐使用,原因就是构造函数内部函数会重复调用的问题,谈不上对象复用

    第三种:实例继承

    这种方式要区别原型链继承,先说继承方法

    第一步:公用继承函数:

              function object(o){

                    function f(){};

                    f.prototype=o;

                    return new f();

              }

    第二步:当你已经有一个实例时,注意是实例,而不是对象,就可以var newFunction=new object(nowInstance);这样就复制出当前实例的一个副本,然后你就可以想这个副本中添加新的属性和方法,而且不会影响当前实例

    这种方法的使用情景就是,当你现在有一个实例时,用这种方法先(通过原型赋值)复制出这样一个实例,然后向这个副本中添加新的属性和方法

    缺点就是实际内部也是通过原型链实现的,当然缺点也是属性共享,而不能独享,优势就是你可以直接那实例来继承,而不用new一个新实例,同时也浪费了当前实例.

    和原型链继承的区别就是,这个事继承实例,而原型链是继承对象

    第三种:通用最佳继承方法继承

    和创建对象一样,继承的最好方法就是联合构造函数和原型链继承两种方法,达到高效,功能强大的继承

    function newFunction(){

            oldFunction.call(this,[“canshu1”,”canshu2”]);

    }

    function inherit(newFunction,oldFunction){

            var prototype=oldFunction.prototype;

            prototype.constructor=newFunction;

            newFunction.prototype=prototype;

    }

    inherit(newFunction,oldFuncton);

    这种方法可以说堪称完美,思想就是通过构造函数继承属性特别是动态属性,然后通过原型来继承原型,很完美.

    实际很多初学者会觉得下面这种方法也行

    function newFunction(){

            oldFunction.call(this,[“canshu1”,”canshu2”]);

    }

    newFunction.prototype=new oldFunction();

    实际这样继承的所有功能也都能实现,包括动态属性,对象复用,都没问题,但是有一点遗憾:就是你每一次调用此对象,都会调用基函数的两次构造函数,这一点不好.读者可以想想是那两个地方调用了两次

    总结继承无外乎三种方式,一种方法,但读者一定要注意的地方就是,继承基本是靠原型链实现的,所以当你向新的函数中添加新的属性和方法时(通过原型方法添加),一定不能用对象字面量的方式,应为这样就会覆盖基函数原型对象,另外一点就是,通过原型添加新属性的代码一定要放在通过原型继承的代码之后,否则,新添加的方法同样也会被覆盖.

  • 相关阅读:
    LIBSVM
    tf-idf
    DIV+CSS例子
    网页背景设置
    获取JDBC中的ResultSet的记录的条数
    SQL 基本语句
    经典SQL语句大全
    JS(截取字符串,显示当前系统时间yyyy-MM-dd,从文本框得到的数值计算)
    JavaScript实现全排列
    Java发送邮件
  • 原文地址:https://www.cnblogs.com/nier/p/2531363.html
Copyright © 2020-2023  润新知