javascript 面向对象(实现继承的几种方式)
欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。
1、原型链继承
核心: 将父类的实例作为子类的原型
缺点: 父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了
function Person (name) {this.name = name;};Person.prototype.getName = function () { //对原型进行扩展return this.name;};function Parent (age) {this.age = age;};Parent.prototype = new Person('riemann'); //这一句是关键 //通过构造器函数创建出一个新对象,把老对象的东西都拿过来。Parent.prototype.getAge = function () {return this.age;};// Parent.prototype.getName = function () { //可以重写从父类继承来的方法,会优先调用自己的。
// console.log(222);
// };var result = new Parent(22);console.log(result.getName()); //riemann //调用了从Person原型中继承来的方法(继承到了当前对象的原型中) console.log(result.getAge()); //26 //调用了从Parent原型中扩展来的方法
2、构造继承
基本思想
借用构造函数的基本思想就是利用call或者apply把父类中通过this指定的属性和方法复制(借用)到子类创建的实例中。
因为this对象是在运行时基于函数的执行环境绑定的。也就是说,在全局中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
call、apply 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
所以,这个借用构造函数就是,new对象的时候(new创建的时候,this指向创建的这个实例),创建了一个新的实例对象,
并且执行Parent里面的代码,而Parent里面用call调用了Person,也就是说把this指向改成了指向新的实例,
所以就会把Person里面的this相关属性和方法赋值到新的实例上,而不是赋值到Person上面,
所以所有实例中就拥有了父类定义的这些this的属性和方法。
因为属性是绑定到this上面的,所以调用的时候才赋到相应的实例中,各个实例的值就不会互相影响了。
核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)
缺点: 方法都在构造函数中定义, 只能继承父类的实例属性和方法,不能继承原型属性/方法,无法实现函数复用,每个子类都有父类实例函数的副本,影响性能
3、组合继承
组合继承(所有的实例都能拥有自己的属性,并且可以使用相同的方法,组合继承避免了原型链和借用构造函数的缺陷,结合了两个的优点,是最常用的继承方式)
核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后再通过将父类实例作为子类原型,实现函数复用
缺点:调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)
function Person (name) {this.name = name;this.friends = ['andy','edgar'];};Person.prototype.getName = function () {return this.name;};function Parent (age) {Person.call(this,'riemann'); //这一步很关键this.age = age;};Parent.prototype = new Person('riemann'); //这一步也很关键var result = new Parent(24);console.log(result.name); //riemannresult.friends.push("小智"); //console.log(result.friends); //['andy','edgar','max']console.log(result.getName()); //riemannconsole.log(result.age); //26var result1 = new Parent(26); //通过借用构造函数都有自己的属性,通过原型享用公共的方法console.log(result1.name); //riemannconsole.log(result1.friends); //['andy','edgar']
4、寄生组合继承
核心:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点
缺点:堪称完美,但实现较为复杂
function Person(name) {this.name = name;this.friends = ['andy','edgar'];}Person.prototype.getName = function () {return this.name;};function Parent(age) {Person.call(this,"riemann");this.age = age;}(function () {var Super = function () {}; // 创建一个没有实例方法的类Super.prototype = Person.prototype;Parent.prototype = new Super(); //将实例作为子类的原型})();var result = new Parent(26);console.log(result.name);console.log(result.friends);console.log(result.getName());console.log(result.age);
javascript 面向对象(实现继承的几种方式)相关推荐
- JavaScript笔记 - 对象继承的几种方式
1)对象冒充 2)call方式 3)apply方式 4)原型链 5)混合方式 1)对象冒充 Js代码 function People(name, age) { this.name = name; th ...
- JavaScript(js)实现继承的几种方式
1.原型链继承 核心:将父类的实例做为子类的原型对象 //动物类function Animal(name,sex) {this.name = name || 'Animal';this.sex = s ...
- JS 总结之原型继承的几种方式
在之前的总结中,我们详细分析了原型<JS 总结之原型>,原型很大作用用于模拟继承,这一次,我们来聊原型继承的几种方式. function Person (age) {this.age = ...
- 继承有几种方式,分别是什么,想要实现继承可以使用哪些方法
这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [继承有几种方式 ...
- Django中Model继承的三种方式
Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...
- jquery、javascript实现(get、post两种方式)跨域解决方法
jquery.javascript实现(get.post两种方式)跨域解决方法 一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(fun ...
- JavaScript 生成唯一ID的几种方式
这篇文章主要介绍了JavaScript 生成唯一ID的几种方式,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下. 编程的世界里,在很多的时候,我们都需要一个唯一的ID来代表一些数 ...
- 可以实现继承的几种方式
继承的几种方式 说起继承,又是一个老生常谈的问题了.今天来讲讲继承的几种方法以及他们的优缺点吧. 源码地址:点击这里 一.原型链继承 原型链继承:通过原型将一个引用类型继承另一个引用类型的属性和方法. ...
- javaScript中创建数组的3种方式
JS数组定义及详解 javascript如何定义数组? 直接上代码和截图 //javaScript中创建数组的3种方式 //方式1 var names = ["令狐冲", &quo ...
最新文章
- 淘宝flink和storm书籍调研
- RSS 没有死亡 而是无所不在
- python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码
- 标准盒子与IE盒子的区别
- 【算法学习】【图像增强】【Retinex】White Patch Retinex 程序解读
- AndroidQQ登录接入详细介绍(kotlin搭建)
- 可靠性五性分析标准和国军标参考(文件分享)
- 数学建模——SPSS的非参数检验
- iOS人脸识别(CoreImage)
- 关于APS生产排产软件选择,有哪几个要素?
- 夜神模拟器连接手柄无反应_夜神模拟器手柄设置
- oracle存货转资产,存货转固定资产账务处理
- 人民币对美元汇率中间价报6.7472元 上调469个基点
- 普元中间件Primeton AppServer6.5安装(Windows)
- 面向政府治理大数据的高性能计算系统
- 无人洗车小程序源码开发
- mysql查询学校开设总课程数_MYSQL数据库课程设计
- 买了一台云服务器能干嘛
- 简答题合集-管理经济学
- sklearn 笔记:高斯过程
热门文章
- python 过滤中文、英文特殊符号
- 桁架工业机器人编程_桁架机器人的制作方法
- python爬取大众点评数据_Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!...
- 8月,Github 最热开源项目排行榜来啦
- 基于工业物联网的中央空调节能控制系统
- 自己做在线HTML编辑器,#6 从零开始制作在线 代码编辑器
- 计算机导师制工作手册模板,学生成长导师制工作手册
- 百度是否收录批量查询工具
- cmd批量修改文件名 增加文字_CMD批量修改文件名的批处理方法
- Pytorch中的NLLLoss代码解释