JavaScript类和对象

news2025/1/19 8:11:10

1、面向对象与面向过程

1.1 面向过程编辑POP(Process-oriented programming)

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。面向过程,就是按照我们分析好的步骤,按照步骤解决问题。

1.2 面向对象编程OOP(Object Oriented Programming)

面向对象是把事务分解成一个个对象,然后由对象之间分工与合作。是以对象功能来划分问题,而不是步骤。
面向对象编辑具有灵活、代码可复用、容易维护和开发的优点。
面向对象的三大特征:封装性、继承性、多态性
优点:易维护、易复用,易扩展,可以设计 出低耦合的系统,使系统更灵活、更加易于维护。
缺点:性能比面向过程低。

2、类和对象

2.1 对象

万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如:一本书、一个人可以是对象,一个数据库、一个远程服务器的连接也可以是对象。
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,使用数据、数组、函数等。
对象是由属性和方法组件的:
● 属性:事物的特征,在对象中用属性来表示(常用名词)
● 方法:事物的行为,在对象中用方法来表示(常用动词)

2.2 类 class

在ES6中增加了类的概念,可以使用class关键字声明一个类,之后以这个类来实例化对象。
抽象了对的公共部分,它泛指某一大类(class)
对象特指某一个,通过类实例化一个具体的对象

2.3 创建类

class name{
// class body
}
创建实例:类必须使用new 实例化对象
const obj=new name()

2.4 构造函数 constructor

constructor()方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个constructor().

1 通过class关键字创建类,首字母大写
2 constructor函数,可以接受传递过来的参数,同时返回实例对象
3 constructor只要new 生成实例时,就会自动调用这个函数,如果不写,类也会自动生成这个函数
4 生成实例,new 不能省略
5 创建类,类名后不加小括号,生成实例 类名后面要加小括号,构建函数不需要function

3、类的继承

3.1 super关键字

super 用于访问和 调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数。

   class Person {
        // 构造函数,
        constructor(name, age) {
          this.name = name;
          this.age = age;
        }
        // 普通函数
        funStr() {
          console.log(`姓名:${this.name},年龄:${this.age}`);
        }
      }
      class Son extends Person {
        constructor(name, age) {
          super(name, age);
        }
      }
      var son = new Son('刘天王', 22);
      son.funStr();

在这里插入图片描述

  1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
  2. 继承中,如果子类里没有,就去找父类有没有这个方法,就执行父类的这个方法
  3. 可以通过super直接调用父类的方法
class Person {
        // 构造函数,
        constructor(name, age) {
          this.name = name;
          this.age = age;
        }
        // 普通函数
        funStr() {
          console.log(`父类的方法`);
        }
      }
      class Son extends Person {
        constructor(name, age) {
          super(name, age); // 调用父类的构造函数
        }
        funStr() {
          console.log(`子类的方法`);
          super.funStr(); // 通过super直接调用父类的方法
        }
      }
      var son = new Son('刘天王', 22);
      son.funStr();

3.2 类的继承extends

子类在构造函数中使用super,必须放到this前面(必须先调用父类的构造方法)

class Person {
  constructor(name, age) {
    this.name = name;
  }
}
class Student extends Person {
  // 子类继承父类
  constructor(name, other) {
    super(name); // 调用父类的constructor
    this.other = other; // 定义子类的属性
  }
}
// 父类
class Animal {
  constructor(name) {
    this.name = name;
  }
  sayHello() {
    console.log('动物在叫~');
  }
}

/**
 * 使用继承后,子类会拥有父类所有的方法和属性
 * 如果子类中添加了和父类相同的方法,则子类方法会覆盖父类的方法(方法重写)
 */
class Dog extends Animal {
  constructor(name, age) {
    // 如果子类中写了构造函数,在子类构造函数中必须对父类构造函数调用
    super(name); // 调用父类的构造函数
    this.age = age;
  }
  sayHello() {
    console.log('Dog:汪汪汪');
  }
  // 子类扩展方法
  run() {
    console.log(`${this.name}在跑……`);
  }
}
class Cat {
  constructor(name, age) {
    super(name);
    this.age = age;
  }
  sayHello() {
    console.log('喵喵喵喵');
  }
}

const dog = new Dog('旺财', 3);
dog.sayHello();

3.3 ES6中的类和对象

1.在ES6中类没有变量提升,所以必须先定义类,才能通过类实例化对象
2.类里面的共有属性和方法一定要加this使用
3.类里面的this指向问题
4.consturctor里面的this指向实例对象,方法里的this指向这个方法的调用者

4、构造函数和原型

4.1 构造函数

构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里。
new在执行时会做四件事性:

  1. 在内存中创建一个新的空对象
  2. 让this指向这个新的对象
  3. 执行构造函数里的代码,给这个新对象添加属性和方法
  4. 返回这个新对象(所以构造函数里面不需要return)
        // 1. 利用 new Object() 创建对象
        var obj1 = new Object();
        // 2. 利用 对象字面量创建对象
        var obj2 = {};
        // 3. 利用构造函数创建对象
        function Star(uname, age) {
            this.uname = uname;
            this.age = age;
            this.sing = function() {
                console.log('我会唱歌');

            }
        }
        var ldh = new Star('刘德华', 18);
        var zxy = new Star('张学友', 19);
        console.log(ldh);
        ldh.sing();
        zxy.sing();

4.2 实例成员和静态成员

构造函数中的属性和方法称为成员

  1. 实例成员:构造函数内部通过this添加的成员 name,fun 就是实例成员,实例成员只能通过实例化对象来访问
  2. 静态成员:在构造函数本身上添加的成员 ,静态成员只能通过构造函数访问
function Star(name){
this.name = name;
this.fun = function(){
  console.log('我是函数') 
}
}

var obj = new Star('刘德华');
console.log(obj.name); // 访问实例成员

Star.age=18;
console.log(Star.age); // 静态成员只能通过构造函数访问

4.3 构造函数原型 prototype

构造函数通过原型分配的函数是所有对象所**共享**的。
每个构造函数都有一个prototype属性,指向另一个对象,注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。

4.4 对象原型 proto

对象都会有一个属性 __proto__指向构造函数的prototype 原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有__proto__原型的存在。

  • __proto__对象原型和原型对象的prototype是等价的
  • __proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象prototype
    在这里插入图片描述

对象原型(__proto__)构造函数(prototype)原型对象 里面都有一个属性 constructor属性,constructor我们称为构造函数,因为它指回构造函数本般。
constructor主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数。
构造函数、实例、原型对象三者之间的关系
在这里插入图片描述

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

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

相关文章

20张图带你了解JVM运行时数据区

运行时数据区总览 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管…

C 程序设计教程(11)—— 字符数据的输入与输出

C 程序设计教程(11)—— 字符数据的输入与输出 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。 目录C 程序设计教程(11&…

【2004NOIP普及组】T2.花生采摘 试题解析

【2004NOIP普及组】T2.花生采摘 试题解析 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。 鲁宾逊先生…

Android---Chip

Chip Chip 代表一个小块中的复杂实体,如联系人。它是一个圆形按钮,由一个标签,一个可选的芯片图标和一个可选的关闭图标组成。如果 Chip 可检查,则可以点击或切换Chip 。 style"style/Widget.MaterialComponents.Chip.Action…

疫情在家搭建的简单易学的SLAM建图机器人

1 简介 Easy_mqOS 是我仿照ROS 搭建的基于MQTT的简易机器人分布式开发框架,是一种轻量级并且十分容易上手的框架,支持多个节点的主题的订阅和单topic发布,节点之间独立、解耦合。没有复杂的文件配置,一定的make编程基础,像正常启动服务一样&a…

Redis未授权访问漏洞(四)SSH key免密登录

前言 系列文章 Redis未授权访问漏洞(一)先导篇 Redis未授权访问漏洞(二)Webshell提权篇 Redis未授权访问漏洞(三)Redis写入反弹连接定时任务 SSH key免密登录 实战实验 环境准备 实验前我们先来复习一遍ssh-key免密登录的流程 攻击机: Centos7 IP:192.168.142.44 靶…

局部变量的特点以及成员变量的区别

1. 概念在上面的章节中,其实已经跟大家介绍了局部变量的概念。即:局部变量是在定义形参、方法或代码块内部的变量,该变量只在当前方法、代码块中有效。2. 特点局部变量具有如下特点:● 局部变量声明在方法、构造方法或者代码块、形…

Mask RCNN网络源码解读(Ⅴ) --- Mask R-CNN论文解读环境配置以及训练脚本解析

目录 1.源码地址 2.项目配置 2.1 环境配置 2.2 文件结构 2.3 预训练权重下载地址(下载后放入当前文件夹中) 2.4 数据集:本例程使用的有COCO2017数据集和Pascal VOC2012数据集 2.4.1 COCO2017数据集 2.4.2 Pascal VOC2012数据集 2…

matplotlib+cartopy+geopandas,实现专业地图可视化!

知乎上有人问如何实现精细化地图?现有的excel、tableau、powerbi都只能套用有限的模板,是否有工具能实现高度定制化?除了专业的Gis软件外,我能想到相对完美的就是使用Python来实现。如果想制作出版级的地图可视化图表,…

《UEFI内核导读》UEFI Application Binary Interface (ABI)简介

敬请关注:“固件C字营 UEFI根据CPU体系结构和编译器的不同有着不同的“调用约定”统称之为“EFI ABI”。以MSVC和x86/x64举例来说,默认MSVC/x86使用 “C标准cdecl”,MSVC/x64使用“MSVC x64 ABI”。Gcc/x86使用“C标准cdecl”,Gc…

ESP-IDF:使用vector和deque容器进行打分排序例程

ESP-IDF实现例程&#xff1a; /5位选手&#xff0c;分别打十个分数&#xff0c;取中间8个分数&#xff0c;求平均值&#xff0c;然后根据选手的分数排序输出/ #include <stdio.h> #include using namespace std; #include #include #include #include class playe…

mongoDB原子操作事务

原子操作 原子操作&#xff08;atomic operation&#xff09;指的是由多步操作组成的一个操作。如果该操作不能原子地执行&#xff0c;则要么执行完所有步骤&#xff0c;要么一步也不执行&#xff0c;不可能只执行所有步骤的一个子集。不可中断的一个或者一系列操作, 也就是不…

Vue3——第三章(生命周期钩子)

一、setup() Vue3在组合式 API中去掉了在Vue3中的beforeCreate、created两个生命周期&#xff0c;使用setup()来顶替这两个生命周期。 二、onBeforeMount() 注册一个钩子&#xff0c;在组件被挂载之前被调用。当这个钩子被调用时&#xff0c;组件已经完成了其响应式状态的设…

国产电源芯片DP4054 软硬件兼容TP4054 规格书资料

DP4054 是一款完整的采用恒定电流/恒定电压单 节锂离子电池充电管理芯片。其SOT小封装和较少的外部元件数目使其成为便携式应用的理想器件&#xff0c;DP4054 可以适合USB 电源和适配器电源工作。跟进口的TP4054完全兼容&#xff0c;软硬件无需更改直接替换。 管脚配置 功能框…

(十六)一篇文章学会Java的常用API

目录 前言: 一、Object:toStringequals 二、StringBuilder 三、Math 四、System 五、BigDecimal 前言: API的主要目的是提供应用程序与开发人员以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实…

The Sandbox Game Maker 全新版本即将推出,一览可用于娱乐、社交和音乐会的新功能!

0.8 版本的新功能将包括多人游戏功能、光影和视觉效果升级&#xff0c;以及音频和视频流&#xff0c;满足社区的更新需求。 简要概括 0.8 版本包括了 The Sandbox 社区的主要升级需求&#xff0c;具体有&#xff1a; 全新多人游戏功能 全新光影和视觉效果 视频和音频流 支援…

OKhttp-基本工作流程责任链模式原理

OKhttp工作的大致流程 整体流程 &#xff08;1&#xff09;、当我们通过OkhttpClient创立一个okHttpClient 、Request 、Call&#xff0c;并发起同步或者异步请求时&#xff1b; &#xff08;2&#xff09;、okhttp会通过Dispatcher对我们所有的Call&#xff08;RealCall实现…

微服务的版本号要怎么设计?

今天我们来聊一下微服务项目中的版本号要怎么设计。 小伙伴们平时看到的项目版本号&#xff0c;基本上都是分为了三部分 X.Y.Z&#xff0c;版本升级的时候版本号都会变&#xff0c;那么版本号怎么变&#xff0c;这可不是拍脑门决定的&#xff0c;今天我们就一起来探讨一下这个…

Live800:客户服务的三重境界,你做到了吗?

毋庸置疑&#xff0c;赢得客户的青睐是维系自身经济长青的基础。想要客户满意&#xff0c;得到最佳的客户评价&#xff0c;企业就需要为客户提供超出他们期望的服务。有人将客户服务分为三重境界:第一重境界&#xff0c;把分内的服务做精&#xff1b;第二重境界&#xff0c;把额…

libtorch c++复现cycle gan网络

目录 1. 原论文论文&#xff1a;https://arxiv.org/abs/1703.10593 2. 代码 2.1 下采样 2.2 残差块 2.3 上采样模块 2.4 生成器代码 3. 判别器 3.1 判别器组件 3. 2 判别器 4. 训练 4.1 输入数据 4.2 生成器loss函数结构图 4.3 判别器loss结构图 1. 原论文 论文&…