js继承的这6种方式!(上)


Posted in Javascript onApril 23, 2019

写在前面

继承的简介

继承”是JavaScript面向对象设计的重要一环,愿你认真读完本文,吃透继承的概念。

继承的核心

js继承的这6种方式!(上)

1. 继承方式一:原型链

1.1 介绍

原型链是实现继承最原始的模式,即通过prototype属性实现继承。

//父级-构造函数
function Father() {
 this.fatherProp = true
}

//父级-原型属性
Father.prototype.getFatherValue = function() {
 return this.fatherProp
}

//子级-构造函数
function Son() {
 this.sonProp = false
}

//子级-原型属性:继承父级
//即__proto__指向父级的prototype
//若不理解请阅读《一张图彻底KO原型链(prototype,__proto__》
Son.prototype = new Father()

//子级-添加原型方法
Son.prototype.getSonValue = function() {
 return this.sonProp
}

//创建子级的实例对象
var son = new Son()
console.log(son.getFatherValue()) //true

1.2 解析:son实例对象是如何找到getFatherValue()方法的呢?

  1. 首先在son对象自身中找。若对象自身没找到
  2. 然后在Son.prototype中找。若Son.prototype中没找到
  3. 继续往上一层,Son.prototype.__proto__(Fater.prototype)
  4. 依次类推,直到找到需要的属性或方法,或到达原型链顶端Object.prototype

如果到最后都没找到,会发生什么呢?

//一个不存在的方法
console.log(son.getValue()) //ERROE:not a function

1.3 注意事项

重写父级原型链的方法或者添加父级原型链不存在的方法,必须在父级原型链代码之后。(这个很好理解,不放代码演示了)

通过原型链实现继承后,不能再使用字面量的方式创建原型对象,因为会覆盖原型链。

//子级-原型属性:继承父级
Son.prototype = new Father()

//不能像下面这样,这样会使得上面的代码无效
//因为这相当于重新创建了一个原型对象
Son.prototype = {
 getSonValue: function() {
  return this.sonProp
 }
}

1.4 原型链实现继承的弊端

世间万事万物都不可能十全而十美,原型链虽然强大,但也存在缺陷。

原型链中引用类型的属性会被所有实例共享的,即所有实例对象使用的是同一份数据,会相互影响。

function Father() {
  this.arr = [1,2,3]
 }

 function Son() {
 }

 Son.prototype = new Father()

 var son1 = new Son()
 console.log(son1.arr) //1,2,3

 var son2 = new Son()
 son2.arr.push(4)

 console.log(son2.arr) //1,2,3,4
 console.log(son1.arr) //1,2,3,4

无法向父级构造函数传参

2. 继承方式二:借用构造函数

2.1 介绍

方式一中引用类型带来的问题可借用构造函数的方式解决。其核心思想是:在子级构造函数中调用父级构造函数。

如何实现在一个构造函数中调用另一个函数?——call()和apply()

function Father() {
  this.arr = [1,2,3]
 }

 function Son() {
  //call的第一个函数是this指向的对象,即构造函数的实例对象
  Father.call(this)

  /*上面代码等同于下面这段代码:
  (function() {
   this.arr = [1,2,3]
  }).call(this)
  */
 }

 var son1 = new Son()
 console.log(son1.arr) //1,2,3

 var son2 = new Son()
 son2.arr.push(4)

 console.log(son2.arr) //1,2,3,4
 console.log(son1.arr) //1,2,3
//解决传参问题:
function Father(name) {
 this.name = name
}

function Son(name) {
 Father.call(this, name)
}

var son1 = new Son("小名")
console.log(son1.name)  //小名

var son2 = new Son("一灯")
console.log(son2.name)  //一灯

2.2 借用构造函数的缺陷

这种方式是通过构造函数实现的,当然也把构造函数自身的问题带过来了——破坏了复用性。因为每个实例都创建了一份副本。

3. 组合继承

3.1 介绍

组合继承 = 原型链 + 借用构造函数。取其长避其短:共享的用原型链,各自的借用构造函数

function Father(name) {
 this.name = name
 this.arr = [1,2,3]
}

Father.prototype.getName = function() {
 console.log(this.name)
}

function Son(name, age) {
 Father.call(this, name)
 this.age = age
}

Son.prototype = new Father()
Son.prototype.constructor = Son
Son.prototype.getAge = function() {
 console.log(this.age)
}

var son1 = new Son("小名", 23)
son1.arr.push(4)
console.log(son1.arr) //1,2,3,4
son1.getName()    //小名
son1.getAge()     //23

var son2 = new Son("一灯", 24)
console.log(son2.arr) //1,2,3
son1.getName()    //一灯
son1.getAge()     //24

3.2 解析

借用构造函数部分:

Father.call(this, name)——name来自Father
this.age = age; Son.prototype.constructor = Son——age来自Son

原型链部分:

Father.prototype.getName——getName方法来自Father.prototype
Son.prototype.getAge——getAge来自Son.prototype

后记

关于继承的后三种方式马上推出,期待你的点赞&关注!

以上所述是小编给大家介绍的js继承方式详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
动态加载js的几种方法
Oct 23 Javascript
用JavaScript编写COM组件的步骤
Mar 17 Javascript
Javascript获取当前时间函数和时间操作小结
Oct 01 Javascript
直接拿来用的15个jQuery代码片段
Sep 23 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
Apr 28 Javascript
基于JavaScript实现在新的tab页打开url
Aug 04 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
vue使用keep-alive保持滚动条位置的实现方法
Apr 09 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 #jQuery
node.js基于socket.io快速实现一个实时通讯应用
Apr 23 #Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
Apr 23 #Javascript
vue 中 beforeRouteEnter 死循环的问题
Apr 23 #Javascript
JavaScript中十种一步拷贝数组的方法实例详解
Apr 22 #Javascript
vue watch关于对象内的属性监听
Apr 22 #Javascript
vue项目中仿element-ui弹框效果的实例代码
Apr 22 #Javascript
You might like
数字转英文
2006/12/06 PHP
php获取根域名方法汇总
2014/10/28 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
用Python解决计数原理问题的方法
2016/08/04 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python绘制3D图形
2018/05/03 Python
python 实现识别图片上的数字
2019/07/30 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python多进程编程常用方法解析
2020/03/26 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
法学毕业生自我鉴定
2013/11/08 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
教师对学生的寄语
2014/04/03 职场文书
十佳青年事迹材料
2014/08/21 职场文书
关于环保的活动方案
2014/08/25 职场文书
领导欢迎词范文
2015/01/26 职场文书
自主招生自荐信范文
2015/03/04 职场文书
公司的力量观后感
2015/06/05 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python