ECMAScript继承是通过原型链来继承的。基本思想是利用原型来让一个引用类型继承另一个引用类型的属性和方法,使原型变为另一个对象的实例。通过原型链实现继承时,不能使用对象字面量创建原型方法,避免重写原型链。

原型链继承的问题

1.原型中的引用类型的值都会被共享。

2.在创建子类型的实例时,无法在不影响所有对象实例的情况下,向超类型的构造函数传递参数。意思是如果向超类型的构造函数传递参数,则会影响到所有该对象的实例。

借用构造函数

为解决上面的问题,可以使用借用构造函数的概念,思想是在子类型构造函数的内部调用超类型构造函数。使用apply或call方法。这种方式的缺点是无法实现方法的复用。

组合继承

比较有效的方式是结合原型链继承与构造函数继承。思路是使用原型链继承原型的属性和方法,借用构造函数(apply或call方法)继承实例属性。这样,即通过原型上定义方法来实现函数复用,又能保证每个实例都有自己独立的属性。

原型式继承

eg:

function object(o){

  function F(){};

  F.prototype = o;

  return new F();

}

寄生式继承

eg:

function aobject(o){

  var clone = object(o);   //创建一个新对象,这个对象的原型属性是o

  clone.method = function(){   //给对象添加方法来增强对象

    alert('aa');

  }

  return clone;    //返回这个新对象

}

寄生组合式继承

思路是借用构造函数来继承属性,通过原型链混成方式来继承方法,也就是子类型的原型继承超类型的原型方法和属性。

eg:

function inheritPrototype(subtype,supertype){

  var prototype = object(super.prototype);    // 创建超类型原型的一个副本

  prototype.constructor = subtype;       //给副本添加construtor属性,弥补因重写原型而失去的默认的constructor属性

  subtype.prototype = prototype;     //将新创建的副本赋值给子类型的原型

}

使用组合式继承是最有效的方法。

总结自:《javascript 高级程序设计》

JS 之继承的更多相关文章

  1. JS对象继承篇

    JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...

  2. js实现继承的5种方式 (笔记)

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  3. js实现继承的方式总结

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  4. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  5. js实现继承的两种方式

    这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...

  6. js实现继承

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  7. 浅谈JS的继承

    JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...

  8. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  9. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  10. JS原型继承与类的继承

    我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

随机推荐

  1. DKNightVersion 的实现 --- 如何为 iOS 应用添加夜间模式

    在很多重阅读或者需要在夜间观看的软件其实都会把夜间模式当做一个 App 所需要具备的特性. 而如何在不改变原有的架构, 甚至不改变原有的代码的基础上, 就能为应用优雅地添加夜间模式就成为一个在很多应用 ...

  2. IOS之KVC和KVO(未完待续)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. MAC OS Finder 中快速定位指定路径

    在看一些 tip 文章的时候,时不时会有需要进到某某目录替换文件之类的步骤.如果碰上这个目录层次够多,一层一层的点击既麻烦又容易出错,有什么快捷的办法呢? 快捷键:Shift + Command + ...

  4. date\"123456 错误排查

    最近服务器重装,干脆将所有的源代码都重新整理了一下,开始一切正常,后来发现,每次修改一个画面的时候就会报错 跟踪了下发现是datetime.SmartDate等时间类型的数据,在进行序列化的时候改变了 ...

  5. Effective Java 64 Strive for failure atomicity

    Principle Failure atomic - A failed method invocation should leave the object in the state that it w ...

  6. 【mysql】关于IO/内存方面的一些优化

    这里使用的是mysql  Ver 14.14 Distrib 5.6.19, for Linux (i686) using  EditLine wrapper 一.mysql目录文件 ibdata1: ...

  7. [瞎JB写] C++多态

    似乎只能通过引用或者指针进行动态多态...蛋疼的语法 #include <iostream> #include <vector> #include <memory> ...

  8. six month dormancy test

    source data: accountleg    year_month    amount acc1A    2010-01    100 acc1A    2010-02    100 acc1 ...

  9. [转]ionic $state.go passed $stateParams

    本文转自:http://stackoverflow.com/questions/19516771/state-go-toparams-not-passed-to-stateparams If you ...

  10. 多人操作sqlite3数据库冲突问题解决方法

    问题描述:sqlite3数据放置在某一台电脑的某个共享文件夹下,操作数据库的应用程序安装在同一局域网下的很多台电脑上,由于存在多人同时使用该应用程序,所以存在多人同时操作数据库的情况.经过测试发现,最 ...