JS中面向对象的多种继承方式
JS本身是基于面向对象开发的编程语言,面向对象开发中最重要的一个概念就是类。
类具有三大特性:封装、继承、多态
封装:类也是个函数,函数的目的是把一个功能代码进行封装,以此实现“低耦合高内聚”
多态:重载和重写
重写:子类重写父类上的方法(伴随着继承运行的)
重载:相同的方法,由于参数或者返回值的不同,具备不同的功能(js中不具备严格意义上的重载,js中的重载,在方法内部进行逻辑判断,根据参数的不同的功能)
继承:子类继承父类的属性和方法。在js中的继承和其他编程语言不太一样
继承的目的:让子类的实例同时也具备父类中私有的属性和公共方法
js中实现继承的方法:原型继承
1、原型继承:让子类的原型等于父类的实例
function parent() {
this.x = 100;
}
parent.prototype.getX = function getX() {
return this.x
}
function son() {
this.y = 200;
}
son.prototype = new Parent(); // 实现继承关键
son.prototype.getY = function getY() {
return this.y
}
let c1 = new son();
console.log(c1);
原型继承的特点:
父类中私有的和公有的方法,最后都变为子类公有的
原型链继承不会把父类的属性和方法拷贝给子类,而是让子类实例基于__proto__原型链找到自己定义的属性和方法
c1.__proto__.xxx = xxx,修改子类原型(原有父类的一个实例)中的内容,对子类的其他实例有影响,但是对父类的实例不会有影响
son.prototype.__proto__ === parent.prototype
2、call继承
function parent() {
this.x = 100;
}
parent.prototype.getX = function getX() {
return this.x
}
function son() {
this.y = 200;
parent.call(this); // 关键点
}
son.prototype.getY = function getY() {
return this.y
}
let c1 = new son();
console.log(c1);
call继承特点:
改变this,让父类中的this变成子类的一个实例,这样父类中的私有属性变成了子类实例的私有属性
只能继承父类中的私有的,不能继承父类中公共的
我们需要的是父类私有的变为子类私有的,父类公有的变为子类公有的
3、组合式继承(call继承 + )
function parent() {
this.x = 100;
}
parent.prototype.getX = function getX() {
return this.x
}
function son() {
this.y = 200;
parent.call(this); // 关键点
}
son.prototype.__proto__ = parent.prototype // 关键点
// 不支持__proto__的浏览器中使用Object.create(对象)
// Object.create()创建一个空对象,让其原型(__proto__)指向这个对象
// 上述代码就变成
son.prototype = Object.create(parent.prototype);
son.prototype.constructor = son;
son.prototype.getY = function getY() {
return this.y
}
let c1 = new son();
console.log(c1);
核心思想:原型继承的另外一个写法,用的不是父类的实例,而是修改子类的原型,指向父类的prototype
es6中的继承extends类似于寄生组合继承
class parent {
constructor() {
// 私有属性
this.x = 100;
}
// parent.prototype.getX = fuunction ...
// 往原型上写方法
getX() {}
}
class son extends parent {
constructor() {
super();
this.y = 200;
}
getY() {
return this.y
}
}
super()执行,类似于parent.prototype.constructor.call(this),如果我们往super中传参数,super(100, 200),类似于把parent中的constructor执行,传递了100和200
JS中面向对象的多种继承方式的更多相关文章
- JS中5种经典继承方式
继承 JS中继承的概念: 通过[某种方式]让一个对象可以访问到另一个对象中的属性和方法,我们把这种方式称之为继承 并不是所谓的xxx extends yyy 为什么要使用继承? 有些对象会有方法(动作 ...
- js中的几种继承方法
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一. 继承:子承父业:一个原本没有某些方法或属性的对象,统一写方法,拿到了另外一个对象的属性和方法 下面是js中的几种继承方式 1.改变this ...
- 详解js中的寄生组合式继承
寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上. 2. ...
- js中的原型、继承的一些想法
最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...
- C++中的三种继承方式
1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? class Parent { }; class Child : public Parent ...
- js中面向对象(创建对象的几种方式)
1.面向对象编程(OOP)的特点: 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有的对象下继承出新的对象 多态:多对象的不同形态 一.创建对象的几种方式 javascript 创建对象 ...
- js中面向对象(创建对象的几种方式)
1.面向对象编程(OOP)的特点: 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有的对象下继承出新的对象 多态:多对象的不同形态 注:本文引用于 http://www.cnblogs. ...
- 关于js中原生构造函数的继承
前言 在如今快节奏的工作当中,很多基础的东西会渐渐地被丢掉.就如继承这个话题,写React的同学应该都是class xxx extends React.Component,然而这可以理解为es5的一个 ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- js中的封装、继承、多态
Javascript是一门解释型的语言,是基于对象的,并不是真正的面向对象的语言,对变量类型的应用也是宽松的,其实它同样可以模拟面向对象的功能: 1 function myfun1(){ 2 ...
随机推荐
- 防微杜渐,未雨绸缪,百度网盘(百度云盘)接口API自动化备份上传以及开源发布,基于Golang1.18
奉行长期主义的开发者都有一个共识:对于服务器来说,数据备份非常重要,因为服务器上的数据通常是无价的,如果丢失了这些数据,可能会导致严重的后果,伴随云时代的发展,备份技术也让千行百业看到了其" ...
- 一文读懂Go Http Server原理
hello大家好呀,我是小楼,这是系列文<Go底层原理剖析>的第二篇,依旧是分析 Http 模块,话不多说,开始. 从一个 Demo 入手 俗话说万事开头难,但用 Go 实现一个 Http ...
- 第三方模块的下载与使用 requests模块 openpyxl模块
今日内容 第三方模块下载操作 第三方模块: 别人写的魔魁啊 一般情况下都很强大 python中模块很多 如果想使用第三方模块 第一次必须先下载 后面就可以反复使用 =内置模块 下载第三方模块的方式: ...
- Z-Blog后台getshell
Z-Blog后台getshell 本人所有文章均为技术分享,均用于防御为目的的记录,所有操作均在实验环境下进行,请勿用于其他用途,否则后果自负. 0x00 环境部署 文件下载地址 打开phpstudy ...
- Quarkus入门体验,22ms启动一个Web服务
简介 Quarkus是类似于Spring Boot的框架,可以方便大家进行Java开发.利用GraalVM的魔力,能更好的适应云原生的场景,极快的启动速度. 创建项目 在IDEA就直接有创建Quark ...
- day16-声明式事务-02
声明式事务-02 3.事务的传播机制 事务的传播机制说明: 当有多个事务处理并存时,如何控制? 比如用户去购买两次商品(使用不同的方法),每个方法都是一个事务,那么如何控制呢? 也就是说,某个方法本身 ...
- 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- OpenMP For Construct dynamic 调度方式实现原理和源码分析
OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理,以及与他相关的动态库函数 ...
- pnpm
一.概念 performant npm ,意味"高性能的 npm".pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景.被 ...
- python爬取丁香园疫情数据
毕设需求了就是说 导师要做关于时间线的- -看发展趋势 不得不今天又现学现卖 首先 创建一个python文件 python.file 引入一点资源 # 发送请求 import requests # 页 ...