JavaScript在前端开发中占据这重要的地位,今天我们就来详细的了解一下js中的封装继承多态,如果有什么不懂的文章底部会有相应的一些详细分析JavaScript封装继承多态的视频资料,可以参考

1.封装类

  怎么封装一个类,也就是创建自定义对象?

  构造函数式

  
1 function Car(sColor,iDoors,iMpg) {2 this.color = sColor;3 this.doors = iDoors;4 this.mpg = iMpg;5 this.showColor = function() {6 alert(this.color);7 };8 }910 var oCar1 = new Car("red",4,23);11 var oCar2 = new Car("blue",3,25);

  和Java模式最像。缺点是每生成实例都会创建一次showColor。

  原型方式

 
 1 function Car() {}23 Car.prototype.color = "blue";4 Car.prototype.doors = 4;5 Car.prototype.mpg = 25;6 Car.prototype.showColor = function() {7 alert(this.color);8 };910 var oCar1 = new Car();

  利用了前述prototype。缺点是不灵活,无法传参数。

  通过给this添加属性的方式创建成员变量都是公有的,在函数体内var的变量都是私有的。类用一个Function来声明,这个Function就是构造函数,如果变量再构造函数外声明就等同静态变量,不需要new就可以访问。

  构造函数和原型混合式

  这种方式为了避免重复创建函数副本。

  1 function Car(sColor,iDoors,iMpg) {2 this.color = sColor;3 this.doors = iDoors;4 this.mpg = iMpg;5 this.drivers = new Array("Mike","John");6 }78 Car.prototype.showColor = function() {9 alert(this.color);10 };1112 var oCar1 = new Car("red",4,23);13 var oCar2 = new Car("blue",3,25);

  但第12行如果不小心忘写了new,Car中的this就是window了,为了避免几个属性加载window上,可以在Car内添加this instanceof Car判断。

  2.原型链

  所有对象都拥有prototype属性,这个属性也是一个对象。给obj.prototype添加属性和方法意味着这些属性和方法挂在了原型链上,原型链下游的对象(子类)可以继承到原型链上所有的方法。也就是说,obj的prototype对象中的属性一般情况下不是给自己用的,用obj.hasOwnProperty(obj.prototype.attr)结果都为false,给自己添加属性直接obj.attr=XXX。

  当一个子类查找一个属性时,首先在自己的属性中查找(注意不去找自己的prototype里的属性),然后查找父类的prototype,一直找到原型链顶端Object.prototype。这个原型链的链接是由prototype.__proto__这个私有属性实现的,子类的prototype.__proto__指向父类的prototype。所有类的基类Object的prototype.__proto__指向null,所以原型链总是有穷的。

  对象实例与上面说的子类类似。

  3.继承

  先看一下call和prototype方式实现继承。

  
1 function BMW(sColor,iDoors,iMpg,len){2 Car.call(this,sColor,iDoors,iMpg); //继承父类Car的属性,可以是一部分.  详见aguments对象可实现重载3 this.len = len; //子类自有属性4 };5 BMW.prototype = new Car(); //获得父类Car的所有方法6 BMW.prototype.showLen = function(){ //子类自有方法7 alert(this.len);8 };9 var x5 = new BMW("green",4,35,5);10 x5.showColor();11 x5.showLen(); //结果弹出"green","5"

  上面代码第2行使用了call继承父类Car的属性。

  原理:call方法的用法是func.call(obj,args),使obj可以调用本不是自己的方法func,从而改变this,args是参数。与它类似的是apply方法,只是传参时参数是数组形式。

  代码第5行使用了prototype继承父类所有方法。

  原理:对象的任何属性和方法都被传递给那个对象的所有实例。子类的prototype设置成父类的实例,就继承了父类的所有属性和方法。但子类的 prototype 属性被覆盖了,原来的方法不复存在,所以子类自有属性需要在prototype设置之后添加。

  继承的顺序:

  上面的代码是先使用call继承属性,同时添加自有属性,再使用prototype继承方法,最后添加自己方法。不要疑惑这个顺序会产生覆盖。如果第5行改为BMW.prototype = new Car('yellow',3,25)才会覆盖。原因是JS的aguments对象,它的特性就不在这里细说了,可以利用它实现函数重载。其实使用call并没有继承到父类的任何属性,因为父类构造函数的参数undefined,父类实例中并没有添加上前几个几个属性,drivers属性有。

  call和prototype的区别:

  这里将父类实例赋给子类prototype有明显限制,引用类型成员在子类中以浅拷贝的方式存在,即一个子类修改引用类型成员,其他类都会受到影响。而call方式没有这个问题,只是每次都产生副本。

  显而易见,call方法可以方便的实现多继承,而原型链方法不能支持多继承。

  另外,call方法继承可以获取父类的一部分属性,而prototype继承只是全盘接收。

  最后一点也相当重要,instanceof可以识别prototype继承,也就是下面两行代码结果都是真。

  alert(x5 instanceof BMW);alert(x5 instanceof Car);

  另一种安全的继承:复制继承

  把属性复制都新对象上,是对象的深拷贝。当然也可以区分父类自有属性和继承属性,有取舍的复制。

  1 var foo = {};2 var prop;3 for(prop in props){4 if(!foo[prop]){5 foo[attr] = obj[attr];6 }7 }

  再谈原型继承

  上面的

 
 BMW.prototype = new Car();

  如果换成

 
 BMW.prototype = Car.prototype;

  会有什么不一样呢?

  如果直接把prototype赋值给子类,子类中改变引用类型的属性会影响到父类。而实例是通过分配空间,构造出来的个体,不会出现这种情况。看下面的例子:

  
1 function People(){}2 People.prototype.name = 'human';3 People.prototype.hi = function(msg){4 console.log(msg);5 }67 var Student = function(){};8 //Student.prototype = new People();9 Student.prototype = People.prototype;1011 var stu = new Student();12 stu.hi && stu.hi('stu');13 Student.prototype.hi = {};14 People.prototype.hi('people'); //不是一个函数

  ES5支持的Object.create()方法。其特点是洁净继承,和方式2相比,没有实例化父类这一步,而是使用一个新对象,把父类的原型复制给新对象的原型。

  模拟Object.create():

- 走进JavaScript面向对象(一) -

http://www.makeru.com.cn/live/1396_805.html?s=45051

- 走进JavaScript面向对象(二) -

http://www.makeru.com.cn/live/1396_806.html?s=45051

转载于:https://www.cnblogs.com/QianD/p/11189599.html

JavaScript如何来实现面向对象的核心封装,继承,多态相关推荐

  1. 第九课(面向对象):封装 继承 多态

    一.面向对象概念:根据模板(创建一个类)并实例化 这个思路就叫面向对象 二.使用面向对象编程好处: 可以重复使用(实例化类) 容易修改(只用修改类的模板) 三.面向对象的特点: 封装 继承 多态 类名 ...

  2. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  3. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  4. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  5. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  6. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  7. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  8. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  9. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

最新文章

  1. Serverless在游戏、电商行业的一个运用场景示例
  2. IOS开发之UIView
  3. Jmeter(4)Http Cookie Manager
  4. aspx mysql类_aspx中的mysql操作类sqldatasource使用示例分享
  5. 九九乘法表的C语言实现
  6. C# 将DataGridView里面的数据提取到DataTable中
  7. 华为全面启航计算战略:“鲲鹏+昇腾”双引擎
  8. 电缆沟巡查机器人_电缆沟道巡检机器人的制作方法
  9. 化工行业ERP管理系统丨外贸软件
  10. PHP实现网页截图?还可以实现登录截图!
  11. 智能制造数据分析综合应用方案
  12. 英伟达发布《永劫无间》最新显卡驱动更新,驱动人生升级教程
  13. IDEA Unable to import maven project: See logs for details (maven的坑)
  14. Halo2学习笔记——设计之Proof和Field实现(3)
  15. 用批处理的方式压缩文件
  16. 迁移操作系统:如何把系统迁移到固态硬盘SSD?
  17. python七段数码管绘制实验报告_Python绘制七段数码管实例代码
  18. 怎么制作游戏脚本_怎么剪游戏视频?五步教你制作绝地求生击杀合集
  19. 数据提取-数据提取软件
  20. nvidia驱动版本查询

热门文章

  1. js地址栏获取参数的方法,解决中文乱码问题,能支持中文参数
  2. MyBatis课程5
  3. Cordova+Ionic之坑
  4. sql语句-linq语言-lambda表达式对照
  5. Flex 给PopUpButton 设置皮肤
  6. ICCV2021 2D和3D通用!新医疗影像自监督SOTA(代码已开源)
  7. 单CPU处理1s视频仅需37ms、GPU仅需10ms,谷歌提出TVN视频架构
  8. 文远知行2020年校招 | 领航者计划
  9. 【项目合作】低清老视频转高清,视频超分辨
  10. 厉害了!谷歌新发布的半监督学习算法降低4倍错误率