zoukankan      html  css  js  c++  java
  • javascript 继承模式思考

    虽说javascript没有直接关键字或者符号实现对继承的支持,我们同样可以通过一些蹩脚的方式实现继承。

    方法一:

    function Base(word) {
        this.say = function () {
            return word;
        }
        this.word = word;
    }
    
    function Sub(word) {
        this.hello = function () {
            return 'hello' + word;
        }
    }
    Sub.prototype = new Base();
    Sub.prototype.constructor = Sub;

    这个方法是我们最常见到的继承方式,但是我们会注意到基类Base构造函数是需要一个word参数的,Sub 子类继承Base时并无法将自己的word参数传给基类。

    new Sub().say() 得到的值永远是undefined。

    方法二:

    function Base(word) {
        this.say = function () {
            return word;
        }
        this.word = word;
    }
    
    function Sub(word) {
        var base = new Base(word);
        base.hello = function(){ return 'hello' + word ; }
      reurn base; }
    var sub = Sub(word);

    这个方法看起来比第一个方法简单多了,也解决了传参数的问题。

    但是这个方法子类是var sub = Sub(word); 不像第一个方法 var sub = new Sub(word); 

    对于有new关键字强迫症的人,是不是看起来很纠结,这个写法是不是总觉得Sub不像一个类。

    方法三:

    function Base(word) {
        this.say = function () {
            return word;
        }
        this.word = word;
    }
    
    function Sub(word) {
        $.extend(this, (new Base).constructor.apply(this, arguments)); // 调用Base 的constructor将初始化完的实例的属性和方法都拷贝到this上面。
        this.hello = function () {
            return word;
        }
    }
    Sub.prototype = Base.prototype; // 保证 new Sub() instanceof Base == true 
    Sub.prototype.constructor = Sub; // 将contructor 设置成自己

    这个写法解决了第一个方法中无法为基类构造函数传参的问题,也使类的实例化方式看起来更自然。

      但是我查了很多资料但是都没看过 

    Sub.prototype = Base.prototype;

    这种写法,不知道是不是有什么隐患。
  • 相关阅读:
    Python:软科中国大学排名爬虫(2021.11.5)
    服务外包系统软件需求分析+原型
    JFinal极速开发框架
    Mapreduce实例——MapReduce自定义输入格式
    利用jieba分析词语频数
    Mapreduce实例——Reduce端join
    Mapreduce实例——Map端join
    Mapreduce实例——MapReduce自定义输出格式
    打卡
    Mongo数据库实验
  • 原文地址:https://www.cnblogs.com/flowforever/p/2452595.html
Copyright © 2011-2022 走看看