前言

了解java等面向对象语言的童鞋应该知道。面向对象的三大特性就是:封装,继承,多态。

今天,我们就来聊一聊继承。但是,注意,我们现在说的是js的继承。

在js的es6语法出来之前,我们想实现js的继承关系,需要借助于原型链。之前的文章,我有讲过原型和原型链的概念。在这,再重新回顾一下。

  1. js中万物皆对象,每个对象都有一个隐式原型 __proto__ ,指向创建它的构造函数的原型对象。
  2. 函数(构造函数)除了有一个隐式原型对象,还有一个属性prototype,它指向一个对象,这个对象就是原型对象,也叫显式原型。
  3. 原型对象有一个属性constructor,它指向这个构造函数本身。

而原型链,就是为了实现js的继承,把实例对象的__proto__属性一层一层的指向它的构造函数的原型对象,直到它(Object.prototype)的原型对象为null。

举例分析

我们现在定义一个构造函数Person作为父类,传入一个name属性,给原型对象添加一个getName的方法。

function Person(name){
this.name = name;
} Person.prototype.getName = function(){
console.log(`姓名:${this.name}`);
}

然后再定义一个构造函数Student,用以继承父类Person

function Student(name){
//此处可以通过call方法来改变this的指向
Person.call(this,name);
//this.name = name;
} var student = new Student("小明");

注意,此时我们只是调用了Person的构造函数,不等同于继承了Person。

可以通过打印 student实例对象来看它的原型链关系:

student  =>  Student.prototype => Object.prototype => null

这不是我们想要的结果,我们需要把原型链的继承关系改为这样的:

student  =>  Student.prototype => Person.prototype => Object.prototype => null

因此,我们需要把Student的原型指向父类Person的一个实例对象:

//创建一个父类构造函数的实例person
var person = new Person();
//把Student的原型指向新创建的 person实例
Student.prototype = person;
//同时需要把Student的构造函数修正为Student,
//因为此时Student的构造函数为Person,可自行 console.log(Student.prototype.constructor)查看
Student.prototype.constructor = Student; //此时就可以正常的调用父类的方法了
student.getName(); //姓名:小明

以上,就可以实现js基于原型链的继承,这是在es6的class概念出来之前。在es6之后,就可以通过class的extends来实现继承。其实,这只是js的语法糖,在js引擎内部帮你实现了原型链的继承关系。

大胆猜测一下,es6这样的语法设计,也是为了迎合大部分面向对象的程序员吧。。。(感兴趣的小伙伴可以了解下typescript和es6)

怎么理解js的原型链继承?的更多相关文章

  1. js重点--原型链继承详解

    上篇说过了关于原型链继承的问题,这篇详解一下. 1. function animals(){ this.type = "animals"; } animals.prototype. ...

  2. JS中原型链继承

    当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型, ...

  3. 8条规则图解JavaScript原型链继承原理

    原形链是JS难点之一,而且很多书都喜欢用一大堆的文字解释给你听什么什么是原型链,就算有图配上讲解,有的图也是点到为止,很难让人不产生疑惑. 我们先来看一段程序,友情提示sublimeText看更爽: ...

  4. js原型链理解(2)--原型链继承

    1.原型链继承 2.constructor stealing(构造借用) 3.组合继承 js中的原型链继承,运用的js原型链中的__proto__. function Super(){ this.se ...

  5. JS原型与原型链继承的理解

    一.原型 先从构造函数开始吧! 构造函数是什么?构造函数与其他函数唯一的区别在于调用方式不同.任何函数只要通过new来调用就可以作为构造函数,它是用来创建特定类型的对象. 下面定义一个构造函数 Fem ...

  6. javascript中继承(一)-----原型链继承的个人理解

    [寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...

  7. js继承之原型链继承

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...

  8. js原型链+继承 浅析

    名称:    prototype--原型对象    __proto__--属性 原型链与继承网上搜索定义,看起来挺绕的 .先说继承: 所有的对象实例都可以共享原型对象包含的属性和方法  例如一个实例A ...

  9. 前端基本知识(二):JS的原型链的理解

    之前一直对于前端的基本知识不是了解很详细,基本功不扎实,但是前端开发中的基本知识才是以后职业发展的根基,虽然自己总是以一种实践是检验真理的唯一标准,写代码实践项目才是唯一,但是经常遇到知道怎么去解决这 ...

随机推荐

  1. @submit.native.prevent作用

    <el-form :inline="true" :model="geCarManageData" class="demo-form-inline ...

  2. Selenium对浏览器支持的版本【2019/10/25更新】

    最新的selenium与几种常用浏览器的版本兼容情况:(以下驱动,点击直接跳转官方下载地址) 尽量选择最新版本-1的浏览器,比如最新的是60,那就使用59.(建议Chrome更新至72+版本.Fire ...

  3. GWAS Catalog数据库简介

    GWAS Catalog The NHGRI-EBI Catalog of published genome-wide association studies EBI负责维护的一个收集已发表的GWAS ...

  4. ai segmentation

    不只是医学图像啊,自然图像分割用unet也能取得非常好的效果.搞过kaggle语义分割的比赛carvana.感觉最好用的还是unet,其次linknet和提拉米苏也好用.large kernel也不错 ...

  5. 利用lsof命令查找已经删除的文件来释放磁盘空间

    测试环境一台服务器/目录空间使用率达到97%,但是通过du -sh *发现实际空间没用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh *发现共实际使 ...

  6. [转]IntelliJ IDEA 2019 上手

    原文地址:https://www.jianshu.com/p/77f81d5fcf02 一.聊一聊Java IDE 作为程序员,经常会看到这么一类的话题:文本编辑器与IDE哪家强.常见的文本编辑器如E ...

  7. Nginx正向代理设置

    Nginx不仅可以做反向代理,实现负载均衡.还能用作正向代理来进行上网等功能. 正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代 ...

  8. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

  9. java判断手机还是电脑访问

    很多博客写的很复杂,没具体看.我只用下面的几行代码 String userAgent = req.getHeader("user-agent"); ) { //安卓 } ) || ...

  10. notepad++删除某关键字所在的行内容

    例如,我要删除zhao这个字符串所在的行 打开notepad++的ctrl+f窗口 点击替换选项,在查找目标输入^.*bp.*$ 其中替换为那里留空,查找模式选择正则表达式,建议也勾选匹配大小写,同时 ...