【学习笔记58】JavaScript面向对象

news2025/1/16 13:59:06

一、认识面向对象

(一)面向过程编程

  • 按照程序执行的过程一步一步的完成程序代码

(二)面向对象编程

  • 面向对象编程是一种编程的方式/模式
  • 官方:对一类具有相同属性和功能的程序代码抽象的描述,实现代码编程
  • 对具有相同属性和功能的,抽象类的描述,实现代码编程
    所谓的抽象类就是具有相同属性和功能的事物的描述
        例如1:有一个面四条腿能坐着,有凳子 、床 、桌子  .....
        例如2:有皮有瓤 ,能吃能榨汁,有西瓜 、橘子 、梨...

(三)面向对象的优点

    1. 将所有程序执行需要的数据,以属性的形式存储在对象中
       将所有实现功能需要的代码,以函数的形式存储在对象中
       一个对象中,存储了程序执行需要的所有代码

    2. 优化程序代码 减少冗余内容

    3. 可以防止全局变量污染
        3.1 将之前的全局变量,存储到对象的属性中
        3.2 全局变量容易被其他程序误操作,发生全局变量污染
        3.3 存储在对象中的数据,不容被其他程序误操作

    4. 面向对象编程适用于大型项目,负载程序开发
        4.1 面向对象编程语法,有很多利于大型项目开发的语法形式
        4.2 封装 继承 多态 ...

二、批量生产对象

1. 字面量方式(不能批量生产)

        const obj = {};
        obj.a = 1;
        obj.b = 2;
        console.log(obj);

        const obj1 = {};
        obj1.a = 1;
        obj1.b = 2;
        console.log(obj1);

在这里插入图片描述

2. 内置构造函数(不能批量生产)

        const obj = new Object();
        obj.a = 1;
        obj.b = 2;
        console.log(obj);

        const obj1 = new Object();
        obj1.a = 1;
        obj1.b = 2;
        console.log(obj1);

在这里插入图片描述

3. 工厂函数方式创建对象

  • 工厂函数, 其实就是一个函数
  • 手动创建一个对象
  • 手动给对象添加属性
  • 手动返回一个对象
  • 这个方法能够创建对象, 并且批量生产也可以
        function createObj (name, age) {
            // 手动创建一个对象
            const obj = {};

            // 手动向对象内部添加属性
            obj.name = name;
            obj.age = age;

            // 手动返回一个对象
            return obj;
        }

        const o1 = createObj('QF001', 18);
        const o2 = createObj('QF002', 28);
        const o3 = createObj('QF003', 38);
        console.log(o1);
        console.log(o2);
        console.log(o3);

在这里插入图片描述

4. 自定义构造函数

  • 自定义构造函数, 本质是就是一个函数
  • new关键字连用的时候, 就叫做构造函数
  • 自动创建一个对象
  • 手动向创建的对象添加属性
  • 自动返回一个对象
        function createObj () {
            // 自动创建出来一个对象

            // 手动向对象添加属性

            // 自动返回一个对象
        }

        const o1 = new createObj();  //这种调用方式, 才是 构造函数
        const o2 = createObj();      //这就是一个普通函数的调用

        console.log(o1);
        console.log(o2);

三、自定义构造函数的书写

    /**
     *  1. 一定是和new关键字连用,如果没有和new连用, 那么他就是一个普通函数
     * 
     *  2. 当一个函数和new关键字连用的时候, 这个函数就被称为自定义构造函数, 这个函数内的 this指向, 指向返回出来对象
     * 
     *  3. 构造函数不能使用给箭头函数,因为箭头函数内部没有this
     * 
     *  4. 构造函数内部不需要 return
     *        return 了基本数据类型, 写了和没写一样
     *        return 了引用数据类型, 写了构造函数就没用了
     * 
     *  5. 书写构造函数时, 首字母建议大写
     *      目的: 仅仅是为了和普通函数区分
     * 
     *  6. 我们构造函数通过new关键字创建出来的对象, 叫做实例化对象, 本质上还是一个对象, 只不过名字上叫做实例化对象(实例对象)
     *     我们把构造函数通过new关键字创建对象的过程叫做实例化
    */
        function createObj(num1, num2) {
            // 此时 this === 将来被返回出去的对象
            this.a = num1;
            this.b = num2;

            // return '我是一个普通字符串'
            // return [1, 2, 3, 4, 5]
        }
        const o1 = new createObj(1, 2);
        const o2 = new createObj(10, 20);
        console.log(o1);
        console.log(o2);

在这里插入图片描述
在这里插入图片描述

四、构造函数不合理的地方

1、不合理的地方

        function Person (name, age) {
            this.name = name;
            this.age = age;
            this.fn = function () {
                console.log('AAAAAA');
            }
        }
        
        const p1 = new Person('QF001', 18);
        const p2 = new Person('QF002', 19);
        
        console.log(p1);
        console.log(p2);

        p1.fn();
        p2.fn();

        console.log(p1.fn == p2.fn);

在这里插入图片描述

案例分析:
在这里插入图片描述

  • 这样写实际功能也能完成, 但是多次创建对象时,会多次创建功能代码完全相同一个函数,这对内存空间是一种浪费

2、解决方法

        function fn() {
            console.log('AAAAAA');
        }
        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.fn = fn;
            /**
             *  这样写实际功能也能完成, 并且在多次创建的时候
             * 
             *  每次给this.fn赋值时, 都会去找到fn函数
             * 
             *  然后多个对象的this.fn 的引用地址都是一个
            */
        }

        const p1 = new Person('QF001', 18);
        const p2 = new Person('QF002', 19);
        console.log(p1);
        console.log(p2);

        p1.fn();
        p2.fn();

        console.log(p1.fn == p2.fn);

在这里插入图片描述

五、ES6构造函数

  1. 函数体和原型, 是需要分开写
  2. 构造函数如果不和new一起连用, 不会报错
  3. ES6类的语法: class 类名{xxxxx}
        class Stu {
            constructor(name) {
                //和构造函数的函数一样
                this.name = name;
            }

            // 这里位开始 全都是原型
        }
        const s1 = new Stu('QF001');
        console.log(s1);

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

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

相关文章

Triangle Attack: A Query-efficient Decision-based Adversarial Attack

Triangle Attack: A Query-efficient Decision-based Adversarial Attack 三角攻击:一种查询高效的基于决策的对抗性攻击 Abstract 基于决策的攻击对实际应用程序构成了严重的威胁,因为它将目标模型视为一个黑箱,只访问硬预测标签。最近已经做出了很大…

【计组】指令和运算1--《深入浅出计算机组成原理》(二)

一、计算机指令 1、指令 从软件工程师的角度来讲,CPU就是一个执行各种计算机指令(Instruction Code)的逻辑.。 这里的计算机指令,也可以叫做机器语言。 不同发CPU支持的机器语言不同,如个人电脑用的是Intel的CPU&a…

同样Java后端开发三年,朋友已经涨薪到了30k,而我才刚到12K。必须承认多背背八股文确实有奇效!

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而,小编要说的是,不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿,薪资的差别还是很大的。 众所周知,目前互联网行业是众多行业中薪资待遇最好的,…

2022年NPDP新版教材知识集锦--【第四章节】(2)

【概念设计阶段】(全部获取文末) 概念描述提供了产品概念的优点和特征的定性描述,其必要性体现在: ①为开发团队的所有成员以及与项目相关的成员提供了清晰性和一致性。 ②是向潜在客户解释产品的重要手段之一。 典型流程: 2.1概念工程 …

python使用websocket服务并在fastAPI中启动websocket服务

依赖 pip install websockets-routes 代码 import asyncio import websockets import websockets_routes from websockets.legacy.server import WebSocketServerProtocol from websockets_routes import RoutedPath# 初始化一个router对象 router websockets_routes.Router()…

Archlinux安装软件的那些事

个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、ArchLinux1.1 ArchLinux原则1.2 软件包管理1.2.1 软件仓库1.2.2 包管理器2、Pacman2.1 pacman介绍2.…

什么是幂等性?四种接口幂等性方案详解!

幂等性在我们的工作中无处不在,无论是支付场景还是下订单等核心场景都会涉及,也是分布式系统最常遇到的问题,除此之外,也是大厂面试的重灾区。 知道了幂等性的重要性,下面我就详细介绍幂等性以及具体的解决方案&#…

SpringBoot中自动配置

第一种: 给容器中的组件加上 ConfigurationProperties注解即可 测试: Component ConfigurationProperties(prefix "mycar") public class Car {private String brand;private Integer price;private Integer seatNum;public Integer getSeat…

币圈已死,绿色积分是全新的赛道吗?

近几年来,移动互联网行业的迅猛发展,快速改变着社会业态。尽管如此,仍有大量企业线上线下处于割裂状态,2020 年一场疫情的突然爆发,并持续到 2022年,对零售行业造成流量崩塌、供应链中断、市场供需下滑等压…

现代 CSS 高阶技巧,完美的波浪进度条效果。

将专注于实现复杂布局,兼容设备差异,制作酷炫动画,制作复杂交互,提升可访问性及构建奇思妙想效果等方面的内容。 在兼顾基础概述的同时,注重对技巧的挖掘,结合实际进行运用,欢迎大家关注。 正…

金属非金属如何去毛刺 机器人浮动去毛刺

毛刺的产生 在金属非金属零件的加工中,由于切削加工过程中塑性变形引起的毛边,或者是铸造、模锻等加工的飞边,或是焊接挤出的残料,这些与所要求的形状、尺寸有所出入,在被加工零件上派生出的多余部分即为毛刺&#xf…

音视频开发之 ALSA实战!

前言: 今天我们来分享一个开源的音频采集代码,现在大部分音频采集都是通过ALSA框架去采集,如果大家把ALSA采集代码学懂,那么大部分的音频采集都可以搞定。这个代码是用ALSA进行音频PCM的采集并保存到本地文件。一、alsa框架的介绍…

C#语言实例源码系列-实现输入框焦点变色和窗体拖拽改变大小

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

002.组合总和|||——回溯算法

1.题目链接: 216. 组合总和 III 2.解题思路: 2.1.题目要求: 给一个元素数量k和一个元素和n,要求从范围[1,2,3,4,5,6,7,8,9]中返回所有元素数量为k和元素和为n的组合。(每个数字只能使用一次) 比如输入k…

深度学习快速入门----Pytorch 系列2

注:参考B站‘小土堆’视频教程 视频链接:【PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】 上一篇:深度学习快速入门----Pytorch 1 文章目录八、神经网络--非线性激活九、神经网络--线性层及其他层…

作为IT行业过来人,我有3个重要建议给后辈程序员!

见字如面,我是军哥!作为一名 40 岁的 IT 老兵,我在年轻时踩了不少坑,我总结了其中最重要的 3 个并一次性分享给你,文章不长,你一定要看完哈~1、重视基础还不够,还要注重技术广度和深…

第2-4-8章 规则引擎Drools实战(1)-个人所得税计算器

文章目录9. Drools实战9.1 个人所得税计算器9.1.1 名词解释9.1.2 计算规则9.1.2.1 新税制主要有哪些变化?9.1.2.2 资较高人员本次个税较少,可能到年底扣税增加?9.1.2.3 关于年度汇算清缴9.1.2.4 个人所得税预扣率表(居民个人工资、…

科教导刊杂志科教导刊杂志社科教导刊编辑部2022年第27期目录

前沿视角《科教导刊》投稿:cn7kantougao163.com 新时代研究生教育质量评价指标体系的框架构建 李军伟;赵永克;杨丹; 1-3 基于现代学徒制的“多主体、双标准、五维度”人才培养质量评价体系构建 汪帆;刘严; 4-6 高教论坛 新工科背景下地方性院校第二课堂…

【云原生】Docker容器服务更新与发现之consul

内容预知 1.consul的相关知识 1.1 什么是注册与发现 1.2 什么是consul 1.3 zookeeper和consul的区别 2. consul 部署 2.1 部署consul服务器 2.2 registrator服务器 3.consul-template 的引入 3.1 consul-template的作用 3.2 consul-template的具体部署运用 &…

微信开发者工具C盘占用大的问题

将User Data 下的文件迁移到其他盘,比如 D盘,E盘,F盘 步骤如下: 1.找到微信开发者工具C盘所在的缓存目录,一般为 C:\Users\ 你的用户名\AppData\Local\微信开发者工具\User Data 将里面的内容全部剪切到其它盘符&…