Javascript 面向对象之继承
本文参考书籍<<Javascript高级程序设计>>
js继承方式:实现继承,主要依靠原型链实现。
原型链:基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。
这里假设创建了一个Person构造函数和person1实例
构造函数、原型和实例的关系:每个构造函数都有一个原型对象(Person.prototype),原型对象都包含一个指向构造函数的指针(Person.prototype.constructor == Person),实例都包含一个指向原型对象的指针(person1.__proto__ == Person.prototype)。
如果,让一个原型对象等于另一个类型的实例,此时,原型对象将包含一个指向另一个原型的指针,另一个原型也包含着一个指向另一个构造函数的指针,以此类推,就构成了实例与原型的链条。
举例 说明:

本质:重写原型对象,代之以一个新类型的实例。

测试得出,此时,实例son1 的从属关系同时属于 Object,Parent,Son 三个对象,我们也发现,此时Son构造函数的constructor属性指向的是Parent,而不是Son。
如果,我们要重写父类中的某个方法,或要添加父类中不存在的某个方法,一定要在替换原型的语句之后。还要注意,在通过原型链实现继承时,不能使用对象字面量创建原型对象。因为这样做就会重写原型链。
原型链的问题:
引用类型的属性,会共享到所有依次对象创建的实例上。

对son1执行的修改,在son2中同样可以反映出来,显然,这不是我们想要的。
第二个问题就是,不能传递参数。
借用构造函数(伪造对象或经典继承):即在子类构造函数内部调用父类构造函数。
举例 说明:

通过call或apply,实际是在新创建的Son实例的环境下调用了Parent构造函数。
传递参数:子类构造函数中向父类构造函数传递参数。

借用构造函数问题:与单独使用构造函数创建对象一样,方法也将在构造函数内部定义。无法复用。且父类的原型上定义的方法,对于子类是不可见的。

小结:原型链继承,会造成实例共享引用类型且无法传参的问题,而借用构造函数继承,只能继承构造函数内部定义的信息,无法继承定义在原型上的属性和方法。
两者皆有缺点,但我们发现,如果,组合使用它们,就能完美解决各自的缺点,形成一种较为完美的继承方式。
组合继承(伪经典继承):基本思想:使用原型链实现对原型属性和方法的继承,使用构造函数实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能保证每个实例都有自己的属性。
举例 说明:

原型式继承:基本思想:通过一个临时性的构造函数,作为中转,实现原型链的连接。
举例 说明:

此外,还有寄生式继承和寄生组合式继承,本文不做讨论。
ES6新增了Class继承方式,有时间学习后再来与大家分享!
Javascript 面向对象之继承的更多相关文章
- JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
前 言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...
- Javascript 面向对象编程—继承和封装
前 言 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类) ...
- javascript面向对象中继承实现?
面向对象的基本特征有:封闭.继承.多态. 在javascript中实现继承的方法: 1.原型链(prototype chaining) 2.call()/apply() 3.混合方式(prototyp ...
- 【前端学习】javascript面向对象编程(继承和复用)
前言 继承,代码复用的一种模式.和其它高级程序语言相比,javascript有点点不一样,它是一门纯面向对象的语言,在JS中,没有类的概念,但也可以通过原型(prototype)来模拟对象 ...
- javascript 面向对象的继承的实现
JavaScript 中的面向对象的初步认识 上面这篇简单的记录了我对 JS面向对象实现的一点初步认识和了解,下面继续研究JS面向对象,实现继承和多态. 之前的学习我了解到了 :构造函数加属性,原型p ...
- javascript面向对象:继承、多态
继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属性),同时可扩展自己的成员,下面介绍几种js中实现继承的方式: 1,对象模仿:通过动态的改变 this 指针的指向,实现 ...
- Javascript面向对象之继承
与类的创建篇一样,这里先贴出最终代码,再做详细分析: // 创建一个父类 function SuperType(){ this.company = 'alibaba'; } function SubT ...
- javascript面向对象事件继承
继承:父类有的,子类也有.父类改变,子类也跟着变. 属性继承: 矫正this (window对象,矫正成object对象) fn .call(this是谁,参数1,参数2...); ...
- javascript 面向对象(实现继承的几种方式)
1.原型链继承 核心: 将父类的实例作为子类的原型 缺点: 父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了 function Person (name) { this.name ...
随机推荐
- centos python3.7 报错 No module named ‘_ctypes’ make: ***
1.先装好python的依赖 2.yum install libffi-devel -y(解决)
- kafka 简单安装以及java小demo
文章目录 第1步,下载解压 kafka: 第2步,运行 kafka: 第3步,创建topic 第4步,生产者发送消息 第5步,消费者接收消息 使用 java 客户端 kafka 0.8.0版本demo ...
- Jeecg_Jflow整合记录
系统组织机构 t_s_deparselect * from t_s_departselect * from t_s_depart where id='402888fd6a8c24e9016a8c531 ...
- 洛谷 P2023 维护序列——线段树
先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加 ...
- (4.20)sql server分离附加操作
关键词:sql server分离.sql server附加.分离附加.sql server附加分离 [0].数据库分离.附加的说明 SQL Server提供了“分离/附加”数据库.“备份/还原”数据库 ...
- 牛客小白月赛18 G Forsaken的三维数点
思路: 这是一道树状数组和二分的题,用线段树空间直接爆,时间也会超 然后这道题我犯了一个很低级的错误,导致我wa了十发左右,一个int型变量用lld输入,然后他给的提示是运行错误,我哭了,我一直以为是 ...
- Python运维-获取当前操作系统的各种信息
#通过Python的psutil模块,获取当前系统的各种信息(比如内存,cpu,磁盘,登录用户等),并将信息进行备份 # coding=utf-8 # 获取系统基本信息 import sys impo ...
- 9-vim-移动命令-04-利用标记返回之前小编辑的代码位置
标记 在开发时,某一块代码可能需要处理,例如编辑或重看. 此时使用命令模式(普通模式)下使用m增加一个标记,这样可以在需要时快速地跳回来或者执行其他编辑操作. 标记名称可以是a~z或者A~Z之间的 ...
- a标签动态修改手机号跳到拨打界面
<div class="primaryButton"> <a :href.stop="'tel:' + createData.salesPhone&qu ...
- 多线程实现奇偶统计v1 - 暴力版
#include <stdio.h> #include <stdlib.h> #include <time.h> #include "pthread.h& ...