继承发展史

1. 传统继承方式——原型链

Grand.prototype.lastName = 'Lee';
function Grand() {}
var grand = new Grand();Father.prototype = grand;
function Father() {this.name = 'hehe';
}
var father = new Father();Son.prototype = father;
function Son() {}
var son = new Son();

假设我们只想让son继承Grand的原型上的lastName属性,但根据原型链,son还会继承father上的name属性。不管是不是想继承的属性都会被继承。

2. 借用构造函数

function Person(name, age, sex) {this.name = name;this.age = age;this.sex = sex;
}function Student(name, age, sex, grade) {Person.call(this, name, age, sex);this.grade = grade;
}
var stu = new Student();

使用call/apply来借用构造函数,并不是传统意义上的继承,不能继承借用的构造函数的原型
且虽然视觉效果上使用call/apply借用构造函数优化了代码,可每次在使用Student()构造函数创建新对象时,实际上多调用了一个Person()函数。

3. 共享原型

Father.prototype.lastName = 'Lee';
function Father() {}function Son() {}
Son.prototype = Father.prototype;

将Father的prototype直接赋值给Son的prototype,使他们俩共用一个原型。
可将此功能封装为一个函数

function inherit(Target, Origin) {Target.prototype = Origin.prototype;
}Father.prototype.lastName = 'Lee';
function Father() {}function Son() {}inherit(Son, Father);
var son = new Son();

可因为共用原型,所以无法再给自身原型添加特有属性。

4. 圣杯模式

将原型链与共享原型两种方式进行结合,得出这种新的模式

新建一个构造函数
function F() {}
使F与Father共享原型,即 F.prototype = Father.prototype;
使Son.prototype = new F();
此时,Son.prototype.__proto__ = F.prototype;
而,F.prototype =  Father.prototype;
所以能通过原型链继承Father.prototype上的属性
var son = new Son();
son.__proto__-->new F()-->new F().__proto__-->Father.prototype而这时,修改Son.prototype上的属性,并不会影响到Father.prototype。
Father.prototype.lastName = 'Lee';
function Father() {}function Son() {}function inherit(Target, Origin) {function F() {}F.prototype = Origin.prototype;Target.prototype = new F();
}
inherit(Son, Father);var son = new Son();
var father = new Father();
Son.prototype.firstName = 'Ricardo';


为防止constructor指向紊乱,通常会在inherit()中加上一条语句

Target.prototype.constructor = Target;

而有时我们希望知道,Target到底继承自谁,所以还会加上一句

Target.prototype.uber = Origin.prototype;
function inherit(Target, Origin) {function F() {}F.prototype = Origin.prototype;Target.prototype = new F();Target.prototype.constructor = Target;Target.prototype.uber = Origin.prototype;
}

Javascript学习总结——继承相关推荐

  1. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript">//继承第一种方式: ...

  2. JavaScript学习(五十六)—寄生式继承(临时构造器的使用)

    JavaScript学习(五十六)-寄生式继承(临时构造器的使用) 寄生式继承(临时构造器的使用): 之所以要使用临时构造器就是要在实现原型链继承时获取上级构造方法原型中的内容,而不要它的私有属性 默 ...

  3. JavaScript学习(五十五)—组合继承

    JavaScript学习(五十五)-组合继承 组合继承:就是借用构造方法继承和原型链继承的组合形式

  4. JavaScript学习(五十三)—借用构造方法继承

    JavaScript学习(五十三)-借用构造方法继承 一.借用构造方法的继承 格式: function 构造方法1(形参1,形参2,形参3...){构造方法1.call(this,形参1,形参2,形参 ...

  5. JavaScript学习(五十二)—继承、call方法和apply方法

    JavaScript学习(五十二)-继承.call方法和apply方法 学习内容 一.继承 二.call方法 三.apply方法 一.继承 所谓继承就是两个构造方法建立起来的某种联系,通过某种联系,可 ...

  6. JavaScript学习笔记(四)---闭包、递归、柯里化函数、继承、深浅拷贝、设计模式

    JavaScript学习笔记(四)---闭包.递归.柯里化函数.继承.深浅拷贝.设计模式 1. 匿名函数的使用场景 2.自运行 3.闭包 3.1前提: 3.2闭包 4.函数对象的三种定义方式 5.th ...

  7. JavaScript学习笔记之对象及继承

    JavaScript学习笔记之对象及继承 对象属性 ES5中有两种属性,数据属性和访问器属性. 数据属性包括[[writable]](能否修改属性的值).[[value]]等等: 访问器属性包括[[C ...

  8. JavaScript语言精粹学习之继承

    JavaScript也有面对对象,面的对象很重要的一点就是继承,语言精粹中的继承篇章写的复杂难懂,且有些东西和现在的es6相比太过于老了,读完后这里我自己整理了一下JavaScript的继承,也对语言 ...

  9. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

最新文章

  1. 日期控件判断是否为空
  2. PHP输出结构类型变量输出,php输出形式实例整理
  3. 计算营业额python_用python教你计算定投能获得多少收益
  4. 一些SAP S4CRM On-Premises开发的代码审查,2017-02-16
  5. LDAP命令介绍---ldappasswordmodify口令修改操作
  6. gstat | 空间插值(三)——克里金插值之泛克里金和简单克里金
  7. ValueError: I/O operation on closed file 解决办法
  8. 2022依旧可用的抖音无水印解析工具,免费分享
  9. HTTP API 认证授权术
  10. 简单几步解决 svchost 占用资源过高的问题
  11. 认识System Center之一
  12. DiskGenius 5.4.6.1441 Portable
  13. 宋鸿兵在《货币战争5》中谈到的美国医疗
  14. 软件系统——需求调研
  15. Redis常用命令入门4:集合类型
  16. vi模式下的几种常用的保存文件并退出命令
  17. 面向搜索引擎编程工具
  18. 矩概念与图像矩详解及其hu矩的运用
  19. js 数组去重 的5种方法
  20. 嵌入式ARM+Linux 多个不同版本的交叉编译器的切换方法

热门文章

  1. 小白的25天CTF征程
  2. Knowledge 1命题逻辑语义蕴含
  3. 提高网站提高网站广告点击率的几个可行方法
  4. windows获取公网IP,记录公网ip脚本和命令
  5. 在线绘制流程图网站、思维导图网站总结
  6. 在vue中渲染数学公式 - MathJax
  7. 强化学习入坑之路04
  8. Web服务器性能测试工具介绍
  9. 人工智能,机器学习与深度学习,到底是什么关系
  10. Linux 下检查 VT-d / IOMMU 是否开启