javascript五大继承方式(原生Javascript实现继承方式及其优缺点详解)
javascript五大继承方式
原生Javascript实现继承方式及其优缺点详解目录
- 前言
- 原型继承
- 优点
- 构造函数继承
- 优点
- 缺点
- 组合式继承
- 寄生式组合继承
- 总结
最近在复习javascript的一些基础知识,为开启新的征程做准备。所以开始记录一些自己学习的内容。
那今天的主题是 js的原生继承方式
废话少说,上代码!
首先是我们的父类代码。
在这里我们创建一个Person的类作为父类,它的构造函数需要2个参数name和age。
然后我们在它的原型上添加一个sayHi的方法。
//父类 function Person (name, age) { this.name = name || 'no name'; this.age = age || 0; } Person.prototype.sayHi = function () { console.log('Hi, I\'m ' + this.name + ' and i\'m ' + this.age + ' years old!'); } var p = new Person('A',20); p.sayHi();//Hi, I'm A and i'm 20 years old!
//原型继承 function Teacher(){ } Teacher.prototype=new Person('B',22); Teacher.prototype.constructor=Teacher; var t = new Teacher(); t.sayHi();//Hi, I'm B and i'm 22 years old! console.log(t instanceof Person);//true console.log(t instanceof Teacher);//true
优点
从上面的代码来看,Teacher 的实例拥有了 Person 的属性和方法。并且实例对象既是 Person的实例也是 Teacher的实例。而且这种继承方式特别的简单。
缺点
我们可以很容易的就发现Teacher类的 name和 age是固定的,都是name=B和age=22,换句话说就是我们无法实现按照我们的意愿给父类的构造函数传参。并且一个我们不能给一个 Teacher 指定多个原型,也就是没法 多继承。然后我们看下下面这段代码:
var t1 = new Teacher(); var t2 = new Teacher(); Teacher.prototype.name = "C"; t1.sayHi();//Hi, I'm C and i'm 22 years old! t2.sayHi();//Hi, I'm C and i'm 22 years old!
上面这段代码中我们可以看到当原型中的属性或者方法被改变时,所有的子类实例的属性和方法也会跟着被改变,也就是原型继承的另一个缺点:所有子类共享同一个原型对象
这里说到了原型,我很早之前也写过一个关于原型的随笔,不过可能也是有些模糊,现在的理解和当时有所不同,我会在后面重新写一篇关于原型的随笔。(写好了我会附上连接)
构造函数继承//构造函数继承 function Teacher (name, age) { Person.call(this, name, age); } var t1 = new Teacher('B', 22); var t2 = new Teacher('C', 30); console.log(t1.name);//B console.log(t2.name);//C console.log(t1 instanceof Person);//false console.log(t1 instanceof Teacher);//true t1.sayHi();//TypeError: t1.sayHi is not a function t2.sayHi();//TypeError: t1.sayHi is not a function
优点
相对于 原型继承 , 构造函数继承解决了所有的子类实例共享统一原型的问题,也可以给父类的构造函数传参,并且我们可以在子类的构造函数中调用多个父类的构造函数,实现所谓的多继承(这里的多继承是指子类通过call,apply等方法去调用父类的构造函数使其拥有父类的属性和方法,但是js中一个函数对象只存在一个 prototype,所以其实我们没法通过原型链的形式去体现出多继承)
缺点
上面的代码中我们可以看出创建的实例只是 子类的实例 并不是 父类的实例 ,不能直观的体现出继承,这种继承方式也无法继承父类的原型上的属性和方法。
组合式继承//组合式继承 function Teacher (name, age) { Person.call(this, name, age); } Teacher.prototype = new Person(); Teacher.prototype.constructor = Teacher; var t1 = new Teacher('B', 22); var t2 = new Teacher('C', 30); Teacher.prototype.name = "D"; console.log(t1.name);//B console.log(t2.name);//C t1.sayHi();//Hi, I'm B and i'm 22 years old! t2.sayHi();//Hi, I'm C and i'm 30 years old! console.log(t1 instanceof Person);//true console.log(t1 instanceof Teacher);//true
组合式继承就是结合了原型继承和构造函数继承的优点,解决了两种方式存在的一些缺点。但是我们会发现每当我们去创建一个子类实例的时候都会去创建一个父类的实例,尽管父类实例不是同一个实例(内存地址不一样),但是他们其实属性和方法上完全一致,所以我们通过下面这种(寄生式组合继承)方式完善它,以避免不必要的实例构造。
寄生式组合继承//寄生式组合继承 function Teacher (name, age) { Person.call(this, name, age); } Teacher.prototype = Object.create(Person.prototype); Teacher.prototype.constructor = Teacher; var t1 = new Teacher('B', 22); var t2 = new Teacher('C', 30); Teacher.prototype.name = "D"; console.log(t1.name);//B console.log(t2.name);//C t1.sayHi();//Hi, I'm B and i'm 22 years old! t2.sayHi();//Hi, I'm C and i'm 30 years old! console.log(t1 instanceof Person);//true console.log(t1 instanceof Teacher);//true
上面的方式解决了我们没创建一个子类实例都去创建一个父类实例的问题,这也是最为常用的一种js的继承方式,如果我们通过Babel去把ES6中的class的继承转成ES5的代码,我们会发现就是用的寄生式组合继承。
总结到此这篇关于原生Javascript实现继承方式及其优缺点的文章就介绍到这了,更多相关原生Javascript继承方式内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- hashtable的javascript实现
- js数字时钟编程(JavaScript实现动态数字时钟)
- javascript五大继承方式(原生Javascript实现继承方式及其优缺点详解)
- javascript里字符串描述(JavaScript字符串操作的四个实用技巧)
- js数组去重的十种方法(JavaScript常用数组去重实战源码)
- javascript 经典算法(JavaScript实现的七种排序算法总结推荐!)
- js中alert加参数写法(详解JavaScript Alert函数执行顺序问题)
- javascript组件库实现(JavaScript分页组件使用方法详解)
- js 定时切换图片(JavaScript定时器实现无缝滚动图片)
- javascript dom事件模型(JavaScript WebAPI、DOM、事件和操作元素实例详解)
- javascript:; 和javascript:void(0);
- javascript 开发网站(帮你提高开发效率的JavaScript20个技巧)
- javascript 自带格式化时间(JavaScript内置日期、时间格式化时间实例代码)
- javascript编写的小游戏(CSS3 实现NES游戏机的示例代码)
- javascript动作事件有哪些(JavaScript之事件循环案例讲解)
- web中如何预防xss攻击(详解前端安全之JavaScript防http劫持与XSS)
- 以家人之名广受好评,剧情生动引起观众共鸣,演员张新成圈粉无数(以家人之名广受好评)
- 三兄妹感情再遇波折,人设接连崩塌 《以家人之名》剧情猜不透(三兄妹感情再遇波折)
- 《小敏家》金波想要复婚 这只是他圈套的第1步,更可恶的在后面(小敏家金波想要复婚)
- 小敏家 剧情离谱一锅乱炖,但他们俩绝对是这部剧的一大 亮点(剧情离谱一锅乱炖)
- 《倚天屠龙记》再遭翻拍,关晓彤主演赵敏,蒋劲夫演张无忌,你怎么看(倚天屠龙记再遭翻拍)
- 吴启华与曾舜晞两代张无忌同框,戏里经典的他却没活出原著的潇洒(吴启华与曾舜晞两代张无忌同框)
热门推荐
- php脚本通过文件路径批量上传文件(php遍历目录下文件并按修改时间排序操作示例)
- hbuilderx怎么创建web项目(HBuilder如何设置web服务器)
- 如何在阿里云虚拟主机部署网站(阿里云云虚拟主机更改操作系统流程)
- python正则表达式入门(Python正则表达式实现简易计算器功能示例)
- mysql索引分几种(MySQL 覆盖索引的优点)
- laravel如何设置默认模块(laravel-admin 中列表筛选方法)
- 存储过程异常处理
- python全局变量设置(Python3.5局部变量与全局变量作用域实例分析)
- vue原样表格导出excel(Vue导出Excel功能的全过程记录)
- java集成钉钉发送消息(Python实现钉钉发送报警消息的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9