原型/原型链/构造函数/类

news2024/11/27 18:46:52

认识构造函数

为什么有构造函数

因为一般的创建对象的方式一次只能创建一个对象, 利用工厂模式创建的对象,对象的类型都是Object类型

什么是构造函数

构造函数也称之为构造器(constructor),通常是我们在创建对象时会调用的函数。
在其他面向对象语言里面,构造函数是存在于类中的的一个方法,称之为构造方法。
在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数。构造函数首字母一般大写。

构造函数与普通函数的区别

  1. 名字:构造函数首字母建议大写;普通函数首字母建议小写
  2. this指向:在构造函数内部,this指向新对象。在普通函数内部,this指向的是全局对象
  3. 返回值:构造函数不用return返回值,默认返回新的实力对象。普通函数如果没有return返回值,返回undefined
  4. 调用:构造函数使用new关键词调用;普通函数直接调用

new操作符调用
new关键字会进行如下操作

  1. 创建一个简单的javaScript对象
  2. 为步骤一的新对象添加属性__proto__,并连接至构造函数的原型对象
  3. 将创建的对象作为this的上下文(上下文:当前执行环境的作用域)
  4. 如果函数没有返回对象则返回this

原型对象

什么是原型对象
prototype(原型对象就是一个容器)
可以让对象实例共享它包含的属性和方法

原型对象与函数与实力对象之间的关系

每个函数都有一个prototype属性指向原型对象。

每个原型对象都有一个constructor属性指向构造函数。

每个对象又有一个特殊的内置属性[[prototype]]指向原型对象,可以通过对象的__proto__属性或者通过Object.getPrototypeOf方法获取

在这里插入图片描述

原型链

什么是原型链
就是实例对象和原型对象之间的链接,每一个对象都有原型,原型本身又是对象,原型又有原型,以此类推形成一个链式结构.称为原型链

原型链查找
当我们从一个对象上获取属性,如果当前对象没有获取到,我们就会去它的原型上获取。
构造函数Object.prototype 是原型链的最末端。它的__proto__指向null

认识class定义类

在ES6(ECMAScript2015)新标准中使用了class关键字来直接定义类
基本上,ES6中的class可以看作只是一个语法糖

使用class声明类

  1. 类声明
    class Person {}
  2. 类表达式
    var Student = class {}

class的继承

  1. Class通过extends关键字实现继承
  2. 子类必须在constructor方法中调用super方法否者新建实例时会报错。
    这是因为子类方法没有自己的this对象,而是继承父类的this对象然后对其进行加工,如果不吊用super方法,子类就得不到this对象

super关键字

super这个关键字既可以当函数使用,也可以当对象使用

  1. 第一种情况,super作为函数调用时,代表父类的构造函数,作为函数时,super()只能用在子类的构造函数中
  2. 第二种情况,super作为对象时在普通方法中指向父类的原型对象;在静态方法中指向父类
    *ES6规定,通过super调用父类方法时,super会绑定子类的this

类的prototype属性和__proto__属性

  1. 子类的__proto__属性表示构造函数的继承,总是指向父类
  2. 子类prototype属性的__proto__属性表示方法的继承,总是指向父类的prototype

ES5继承机制与ES6继承机制的不同

ES5的继承实质上是先创造子类的实例对象,然后将父类的方法添加到this上面(Parent.apply(this))。ES6的继承机制完全不同,实质上是先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this

实现继承的方案

原型链继承(以父类实例为原型)

  1. 首先定义父类构造函数
  2. 在父类构造函数上添加方法
  3. 定义子类构造函数
  4. 创建父类实例对象,并且作为子类构造函数的原型对象
  5. 在子类原型对象上添加内容
    在这里插入图片描述

弊端

  1. 通过直接打印的方式看不到继承属性
  2. 属性被多个对象共享,如果是引用类型会造成问题
  3. 不能给父类构造函数(Person)传递参数,因为这个对象是一次性创建的(无法定制化)

借用构造函数继承

  • 借用继承的做法很简单:在子类型构造函数内部调用父类构造函数,通过call()方法执行构造函数
    -

弊端

不能继承父类原型上的属性和方法

组合式继承

原型链继承 + 借用构造函数继承

在这里插入图片描述

弊端

  1. 会调用两次父类构造函数
  • 一次是在创建子类原型的时候
  • 一次是在子类构造函数内部
  1. 子类的实例会有两份父类属性
  • 一份在当前实例中
  • 一份在子类对应的原型对象中
  • 无需担心两份属性的访问问题,因为默认访问实例本身这一部分

原型式继承

  • 这种继承方法不是通过构造函数来实现的。
    与ES6中的Object.create()方法效果相同。
    最终目的是新对象的原型指向原对象

在这里插入图片描述

寄生式继承

寄生式继承的思路是结合原型式继承和工厂模式的一种方式
即创建一个封装继承过程的函数,该函数在内部以某种方式来增强对象,最后将这个对象返回

在这里插入图片描述

寄生组合式继承

组合式继承+原型继承+寄生继承
子类构造函数的原型是以父类构造函数原型为原型创建出来的新对象

能不能直接让子类型的原型对象 = 父类型的原型对象呢?不要这么做, 因为这么做意味着以后修改了子类型原型对象的某个引用类型的时候, 父类型原生对象的引用类型也会被修改

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Uni-app项目应用总结(一)

目录 一.新建uniapp项目 第一步:下载HBuilder 第二步:创建uni-app项目 第三步:运行uni-app 二.uni-app组件使用 三.uni-app路由跳转  1.页面路由配置    (1)在pages.json中配置页面路由    (2)在pages.json中配置底部导航栏 2.路由跳转方法…

【输配电路 DZY-104端子排中间继电器 接通、信号转换 JOSEF约瑟】

DZY-104端子排中间继电器品牌:JOSEF约瑟型号:DZY-104名称:端子排式中间继电器触点容量:5A/250V功率消耗:≤1.5W/≤3W/≤7W/≤3VA/≤7VA/≥5W绝缘电阻:≥10MΩ 系列型号: DZY-101端子排中间继电器; DZY-104端子排中间继电器; DZY-105端子排…

华南农业大学|图像处理与分析技术综合测试|题目解答:求芒果单层坏损率

设计任务 对于一幅芒果果实内部的 CT 断层图像,试采用图像处理与分析技术,设计适当的算法和程序,首先分割出其中的坏损区域,然后计算其像素面积占整个果肉区域的百分比(单层坏损率)。请按统一要求写出算法…

nuc980 uboot 2017.11 移植:env 保存位置选择问题

开发环境 Win10 64位 ubuntu 20.04 虚拟机 VMware Workstation 16 Pro 开发板:NK-980IOT(NUC980DK61Y) gcc 交叉编译工具链: ARM 官方 gcc version 11.2.1 20220111 NUC980 uboot 版本 :尝试移植到 u-boot-2017.1…

科普 “平均工资又涨了”

周四晚上做了一个图,发了一则朋友圈,科普了一下为什么平均工资一直在涨: 曲线是 drawio 画的,不是类似 geogebra 画的精确数学函数,误差比较大,但大概就是这个意思。 收入应该是无标度分形的幂律分布&am…

孙鑫VC++第三章 4.窗口类、窗口类对象与窗口三者之间关系

目录 1. 创建CWnd 2. WinMain 3. 创建CButton 1. 创建CWnd 模拟CWnd类的封装过程。在解决方案ch04下添加一个新的空项目,项目名称为:WinMain,在项目创建完成后,将WinMain项目设为启动项目。 接下来在WinMain项目中添加一个名…

【C++ 学习 ④】- 类和对象(下)

目录 一、初始化列表 1.1 - 定义 1.2 - 使用初始化列表的原因 1.3 - 成员变量的初始化顺序 二、静态成员 2.1 - 静态成员变量 2.2 - 静态成员函数 三、友元 3.1 - 友元函数 3.2 - 友元类 四、内部类 五、匿名对象 5.1 - 匿名对象的特性 5.2 - 匿名对象的使用场景…

3.View的绘制流程

View是在什么时候显示在屏幕上面的?(如:MainActivity的布局文件activity_main.xml) setContentView最终的结果是将解析的xml文件中的View添加到DecorView中. 那么这个DecorView是什么时候添加到Window(PhoneWindow)的呢? DecorView是在ActivityThread.java的handleResumeA…

2-Zookeeper单机版安装

2-Zookeeper单机版安装 本文介绍的是 Linux 系统下 Zookeeper 安装方式 ① 下载 进入官网 https://zookeeper.apache.org/ 点击下载按钮 进入下载页 https://zookeeper.apache.org/releases.html 后选择 最新的稳定版本,如下: 3.7.1 为最新的稳定版本…

号称分割一切的图片分割模型开源了——Segment Anything Meta SAM

头条号:人工智能研究所 微信号:启示AI科技 微信小程序:AI人工智能工具 以前,要解决任何类型的分割问题,有两类方法。第一种是交互式分割,允许分割任何类别的对象,但需要人通过迭代细化掩码来指导。第二种,自动分割,允许分割提前定义的特定对象类别(例如,猫或椅子),…

【计算机系统】指令

leaq指令 一元指令 二元指令 例子 指令addq 指令subq 指令incq 指令subq 移位指令 移位指令用途 特殊运算指令

LitCTF2023 郑州轻工业大学首届网络安全赛 WP 部分

LitCTF2023 郑州轻工业大学首届网络安全赛 WP 部分 前言:Web:我Flag呢?导弹迷踪:Follow me and hack me:PHP是世界上最好的语言!!作业管理系统:Vim yyds:Ping&#xff1a…

Java基础-面向对象总结(2)

这篇文章主要讲解 Java中的 变量方法代码块访问修饰限定符Java 是值传递,还是引用传递?类和对象的生命周期..... 希望给您带来帮助 目录 变量 成员变量与局部变量的区别 静态变量和实例变量的区别?静态方法、实例方法呢? 可以…

数据分析06——Pandas中的数据抽取

1、前言: 在Pandas中进行数据抽取主要有两种方法,一种是loc方法,一种是iloc方法;在获取数据时可以获取的数据有三种形式,一种是Series类型,一种是DataFrame类型,还有一种是直接获取数据值&…

Nginx make报错处理

文章目录 make报错:fatal error:sys/sysctl.h:No such file or directory问题处理 make 报错:error: this statement may fall through [-Werrorimplicit-fallthrough]问题处理 make报错:error: struct crypt_data has no member named curre…

DCGAN--Keras实现

文章目录 一、Keras与tf.keras?二、keras中Model的使用三、使用Keras来实现DCGan1、导入必要的包2.指定模型输入维度:图像尺寸和噪声向量 的长度3、构建生成器4、构造鉴别器5、构建并编译DCGan6、对模型进行训练7、显示生成图像8、运行模型 总结 一、Ker…

力扣sql中等篇练习(二十)

力扣sql中等篇练习(二十) 1 寻找面试候选人 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 分为以下两者情况,分别考虑,然后union进行处理(有可能同时满足,需要去进行去重) # ①该用户在 三场及更多…

软件测试八股文,软件测试常见面试合集【附答案】

PS:加上参考答案有几十万字,答案就没有全部放上来了,高清打印版本超过400多页,评论区留言直接获取 1、你的测试职业发展是什么? 2、你认为测试人员需要具备哪些素质 3、你为什么能够做测试这一行 4、测试的目的是什么? 5、测…

一图看懂 attrs 模块:一个在类定义时可替换 `__init__`, `__eq__`, `__repr__`等方法的样板,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 attrs 模块:一个在类定义时可替换 __init__, __eq__, __repr__等方法的样板,资料整理笔记(大全) 🧊摘要&#x1…