回顾之前学到的知识,大体上可以分为两类:

  1. 基于构造器工作的模式。

  2. 基于对象的工作模式。

  3. 是否使用原型

  4. 是否执行属性拷贝。

  5. 两者都有(执行原型属性拷贝)

下面我们把之前的知识都来回顾一下:

1.原型链法(仿传统):

child.prototype = new Parent();

所属模式:基于构造函数的模式,使用原型链模式。

技术注解:默认继承机制,我们可以将方法与属性集中可重用的部分迁移到原型链中,而将不可重用的那部分属性与方法设置成自身的属性。

2.仅从原型继承法:

Child.prototype = Parent.prototype

所属模式:基于构造函数的工作模式,原型拷贝模式(不存在原型链,所有对象共享一个原型)。

技术注解:由于该模式在构建继承关系上不需要新建对象实例,所以在效率上会有较好的表现。

     原型链上的查询也比较快,因为这里根本不存在链。

       缺点在于,对子对象的修改会影响父对象,因为子对象只是父对象的一个引用。

3.临时构造器法:

function extend(Child, parent){
    var F = fucntion(){};
    F.prototype = Parent.prtotype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.uber = Parent.prototype;
}

所属模式:基于构造函数的工作模式,使用原型链模式。

技术注解:此模式不同于1号模式,她只继承父对象的原型属性,而对父对象的自身属性(也就是被添加到父级构造函数中this的属性)则不予继承。

       另外,此模式还提供了访问父对象的方式。(即通过usber属性)。

4.原型属拷贝法:

function extend2(Child, Parent){
    var p = Parent.prototype;
    var c = Child.prototype;
    for(var i  in p){
        c[i] = p[i];
    }
    c.uber = p;
}

所属模式:基于构造器工作模式,属性拷贝模式,使用原型模式。

技术注解:将父对象原型中的内容全部转化为子对象的原型属性。

       无需为继承单独创建对象实例。

     原型链本身也更短。

5.全属性拷贝法:

function extendCopy(p){
    var c = {};
    for(var i in p){
        c[i] = p[i];
    }
    c.uber  = p;
    return c;
}

所属模式:基于对象的工作模式,属性拷贝模式。

技术注解:非常简单,没有使用原型属性。

6.深拷贝法:

function deepCopy(Parent, Child){
    Child = Child || {};
    for(var i in Parent){
        if(Parent.hasOwnProprty(i)){
             if(typeof Parent[i] === 'Object'){
                 Child[i] = Array.isArray(p[i]) ? [] : {};
                 deepcopy(Parent[i], Child[i]);
             }else{
                 Child[i] = Parent[i]
             }
        }
    }
    return Child;
}

所属模式:基于对象的工作模式,属性拷贝模式。

技术注解:与5相同,但所有对象都是值传递。

7.原型继承法:

function object(o){
    function F(){};
    F.prototype = o;
    return new F();
}

所属模式:基于对象工作模式,基于原型链模式。

技术注解:丢开仿类机制,直接在对象之间构建继承关系。

发挥原型固有优势。

8.扩展与增强模式:

function objectPlus(o, stuff){
    var n;
    function(){};
    F.prototype = o;
    n = new F();
    n.uber = o;
    for(var i in stuff){
        n[i] = stuff[i]
    }
    return n;
}

所属模式:基于对象工作模式,使用原型链模式,属性拷贝模式。

技术注解:该方法实际上是原型继承与原型拷贝的混合应用,她通过一个函数一次性的完成对象的继承与扩展。

9.多重继承法:

function multi(){
    var n = {}, stuff, j = 0;
    len = arguments.length;
    for(j=0;j<len;j++){
        stuff = argument[j];
        for(var i in stuff){
            n[i] = stuff[i];
        }
    }
    return n;
}

所属模式:基于对象工作模式,属性拷贝模式。

技术注解:一种混合插入式继承实现。

         她会按照父对象的继承顺序依次对她们进行属性全拷贝。

10.寄生继承法:

function parasite(victim){
    var that = object(victim);
    that.more = 1;
    return that;
}

所属模式:基于对象工作模式,使用原型链模式。

技术注解:该方法通过一个类似于构造器的函数来创建对象。

     该函数会执行相应的对象拷贝,并对其进行扩展,然后返回该拷贝。

11.构造器借用法:

function Child{
    Parent.apply(this, arguments);
}

所属模式:基于构造器的工作模式。

技术注解:该方法只能继承父对象的自身属性(也就是构造函数里的this.属性、方法)。

       可以与方法一相结合。

     她便于我们的子对象继承某个对象的具体属性时,该方式是最简单的方式。

12.构造器借用与属性拷贝法:

function Child(){
    Parent.apply(this, argument);
}
extend2(Child, Parent);

所属模式:基于构造器的工作模式,使用原型链模式,属性拷贝模式。

技术注解:她允许我们在不重复使用调用对象构造器的情况下同时继承自身属性和原型属性。

额,持续更新了这么多天,大概也就这么多了,能力有限,多多包涵!

下面,我们在持续探讨,我们的javascript宿主环境,也就是浏览器环境(Bom),大家换一种思路来看待一下的文章吧!!!

javascript --- 继承小结的更多相关文章

  1. Js继承小结

    Js继承小结 一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.n ...

  2. javascript继承的三种模式

    javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...

  3. javascript继承机制的设计思想(ryf)

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  4. 【读书笔记】javascript 继承

    在JavaScript中继承不像C#那么直接,C#中子类继承父类之后马上获得了父类的属性和方法,但JavaScript需要分步进行. 让Brid 继承 Animal,并扩展自己fly的方法. func ...

  5. 图解JavaScript 继承

    JavaScript作为一个面向对象语言,可以实现继承是必不可少的,但是由于本身并没有类的概念(不知道这样说是否严谨,但在js中一切都类皆是对象模拟)所以在JavaScript中的继承也区别于其他的面 ...

  6. JavaScript强化教程——Cocos2d-JS中JavaScript继承

    javaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...

  7. [原创]JavaScript继承详解

    原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...

  8. javascript继承(六)—实现多继承

    在上一篇javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) ,介绍了js较完美继承的两种实现方案,那么下面来探讨一下js里是否有多继承,如何实现多继承.在这里可以看看j ...

  9. javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)

    一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...

随机推荐

  1. EXCEL宏做数据拆分

    用处:将大容量的EXCEL工作簿分解成若干个小的工作簿 Sub aa() For i = 1 To 8 Set nb = Workbooks.Add nb.SaveAs Filename:=ThisW ...

  2. js---JSONP原理及使用

    极简解释: 利用<script>标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的.当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址 ...

  3. loj2014 「SCOI2016」萌萌哒

    神tm st表+并查集 #include <iostream> #include <cstdio> #include <cmath> using namespace ...

  4. Leetcode26--->Remove Duplicates from Sorted Array(从排序数组中移除相同的元素)

    题目: 给定一个排序数组,移除重复出现的元素,保证每个元素最终在数组中只出现一次.返回新数组的长度length; 要求:不能分配额外的一个数组使用,必须使用原地排序的思想,且空间复杂度为O(1) 举例 ...

  5. 深度学习:Sigmoid函数与损失函数求导

    1.sigmoid函数 ​ sigmoid函数,也就是s型曲线函数,如下: 函数: 导数: ​ 上面是我们常见的形式,虽然知道这样的形式,也知道计算流程,不够感觉并不太直观,下面来分析一下. 1.1 ...

  6. Leetcode 457.环形数组循环

    环形数组循环 给定一组含有正整数和负整数的数组.如果某个索引中的 n 是正数的,则向前移动 n 个索引.相反,如果是负数(-n),则向后移动 n 个索引. 假设数组首尾相接.判断数组中是否有环.环中至 ...

  7. [python IO学习篇] [打开包含中文路径的文件]

    https://my.oschina.net/mcyang000/blog/289460   打开路径含有中文的文件时,要注意: 1 在windows对文件名编码是采用gbk等进行编码保存,所以要将文 ...

  8. oracle查询包含大小写的数据

    查询包含小写的所有数据: select oper_no from info_oper where regexp_like(oper_no,'[[:lower:]]'); select oper_no  ...

  9. iOS启动动画效果实现

    原理 在window上加一个UIImageView它的图片和启动图的图片一样,然后再调整动画 运行展示 demo百度云连接:http://pan.baidu.com/s/1c0QcYu0 more:网 ...

  10. 【Luogu】P2634聪聪可可(树形DP)

    题目链接 水题,时限放得非常宽,暴力DP随便套上一波register就能卡过去. 唯一的遗憾是5A. 树形DP,s[i][j]表示以i为根的子树里距i的距离%3=j的点数,f[i]表示i为根的子树内一 ...