JavaScript 继承 封装 多态实现及原理详解


Posted in Javascript onJuly 29, 2019

面向对象的三大特性

封装

所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

我们在vue项目中使用混入将公有代码提出来,混入到每个需要的组件中,让我们的代码更简洁

我们也可以将一些公用的方法,工具进行封装,达到代码复用,让我们的代码更简洁

继承

所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

实现继承的几种方式

call继承

function a (){
    this.c=111
  }
  function b(){
    a.call(this)
  }
  let d = new b()
  console.log(d.c) // 111

上面代码相当于函数b继承了函数a的私有属性,通过改变父类的this实现继承

原型继承

function a (){
    this.c=111
  }
  a.prototype.getName=function(){
    return '你好'
  }
  function b(){
    // a.call(this)
  }
  b.prototype=new a()
  b.constructor=b
  let d = new b()
  console.log(d.c) // 111
  console.log(d.getName()) // 你好

原型继承通过将父类的实例赋值给子类的原型,这种方法子类可以继承父类的私有方法也可以继承父类的私有方法

寄生组合继承

function a (){
    this.c=111
  }
  a.prototype.getName=function(){
    return '你好'
  }
  function b(){
    a.call(this)
  }
  b.prototype=Object.create(a.prototype)
  let d = new b()
  console.log(d.c) // 111
  console.log(d.getName()) // 你好

寄生组合继承就是使用call继承改变this,实现私有继承私有,使用object.create实现公有继承公有

es6 extends 继承

class parent{
    constructor(){
      this.a=1
    }
    name(){
      return 2
    }
  }
  class child extends parent{
    
  }
  let A = new child()
  console.log(A.a) // 1
  console.log(A.name()) // 2

这里通过关键字extends实现子类继承父类的私有和公有,这里需要注意如果子类里面写了constructor,就必须写super否则会报错

class parent{
    constructor(){
      this.a=1
    }
    name(){
      return 2
    }
  }
  class child extends parent{
    constructor(){
    // 这里不写super会报错,报错信息如下
    }
  }
  // ncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor at new child

多态

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

重载

函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

  • js通过函数名找到对应的函数对象
  • 然后根据函数按照定义时的参数,和表达式参数列表按顺序匹配,多余的参数舍去,不够的参数按undefined处理
  • 然后执行函数代码。
// 可以跟据arguments个数实现重载
  function add() {
    var sum = 0 ;
    for ( var i = 0 ; i < arguments.length; i ++ ) {
      sum += arguments[i];
    }
    return sum;
  }
  console.log(add()) // 0
  console.log(add(1,2)) // 3
  console.log(add(1,2,3)) // 6

重写

“实例中的指针仅指向原型,而不是指向构造函数”。

“重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的关系;它们引用的仍然是最初的原型”。

var parent = function(name,age){
  this.name = name;
  this.age = age;
}
 
parent.prototype.showProper = function(){
  console.log(this.name+":"+this.age);
}
 
var child = function(name,age){
  parent.call(this,name,age);
}
 
// inheritance
child.prototype = Object.create(parent.prototype);
// child.prototype = new parent();
child.prototype.constructor = child;
 
// rewrite function
child.prototype.showProper = function(){
  console.log('I am '+this.name+":"+this.age);
}

var obj = new child('wozien','22');
obj.showProper();

上面这段代码通过使用寄生组合继承,实现子类私有继承父类私有,子类公有继承父类公有,达到重写父类的showProper

面向对象的5大原则

  • 单一职责原则
  • 开放封闭原则
  • 替换原则
  • 依赖原则
  • 接口分离原则

单一职责原则

单一职责原则就是我们说的一个方法只做一件事,就比如现在的项目结构,就遵循了单一职责原则

开放封闭原则

开放封闭原则就是对修改关闭,对扩展开放

class a {
   add(){
     return 11
   }
 }
 class b extends a{
   
 }
 let c = new b()
 console.log(c.add()) // 111

我们可以使用extends继承父类,可以再b里面修改add函数,实现对修改关闭,对扩展开放

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
图片连续滚动代码[兼容IE/firefox]
Jun 11 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
Jun 05 Javascript
js老生常谈之this,constructor ,prototype全面解析
Apr 05 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
浅谈jquery设置和获得checkbox选中的问题
Aug 19 Javascript
Ajax的概述与实现过程
Nov 18 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 #Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
Jul 29 #Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 #Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 #Javascript
javascript中this的用法实践分析
Jul 29 #Javascript
学习LayUI时自研的表单参数校验框架案例分析
Jul 29 #Javascript
jquery.pager.js分页实现详解
Jul 29 #jQuery
You might like
提问的智慧(2)
2006/10/09 PHP
PHP学习之PHP变量
2006/10/09 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
php判断访问IP的方法
2015/06/19 PHP
php表单提交实例讲解
2015/11/12 PHP
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
Python程序设计入门(2)变量类型简介
2014/06/16 Python
python登陆asp网站页面的实现代码
2015/01/14 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
python Timer 类使用介绍
2020/12/28 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
介绍一下SQL Server的全文索引
2013/08/15 面试题
幼儿教师自我鉴定
2013/11/02 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
Python 中random 库的详细使用
2021/06/03 Python
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL