Javascript面向对象编程之工厂模式、构造函数和ES6的class类

【ES6新特性】Class类用法与解析 ES6 的 Class`让 JS 面向对象编程更加优雅,像极了从“手工作坊”升级到“智能工厂”! 阅读详情
AI摘要

本文从JavaScript单例模式出发,逐步介绍工厂模式、构造函数模式、原型模式,最终过渡到ES6的Class类,并探讨其继承、静态方法等特性。

JavaScript面向对象系列连接

JavaScript 面向对象之Object的getter和setter的使用

引言

回家过年时,家人又提到我该找个对象了,好吧,那现在就来谈谈对象吧
了解过java的童鞋们一定都知道java是个面向对象的语言,在Java的世界中,一切皆对象
面向对象的特性:封装性、继承性、多态性,这里我局部过多解释,不懂的请问度娘
我们前端开发所用的Javascript当年既然借了java的风头出世(事实上java和Javascript没半毛钱关系),现在也同样可以模仿java的面向对象编程啦~~

为什么要用面向对象的思想来编程

  1. 解决系统的可维护性,可扩展性,可重用性。减少结构化编程的冗余和不可重用,可维护性差的弊端
  2. 面向对象是模块化和组件化发展的基础,可以说一个模块要能在其他地方使用,首先它得要是一个对象。组件相当于由一个或多个对象组成的一个大的对象
  3. 在模块化和组件化发展的如日中天的现在,不懂面向对象的你,在面对当今三大框架肯定会有很多的困惑,学习难度大大增加

js开发中是如何产生面向对象的

  1. js开发中,难免会写很多的 function(){} ,随着代码体积的增大,你可能会有很多的function,这样出错后就不容易定位错误在哪儿,由此便在js中引进了单例模式
  2. js单例模式:一个常见的用法就是在开发中把一系列的属性和方法写在一个对象中去,这样的好处一是可以避免多人开发的命名冲突,二是遇到错误可以根据对象快速定位错误地方,弊端就是单例模式一旦定义好对象,不能轻易修改内部方法,否则会出现代码杂乱可维护性变差的问题。例:

    var person = {
        name: name,
        age: age,
        job: job,
        byBus: function() {
            ...
        },
        cookie: function() {
            ...
        },
        ...
    }
  3. js单例模式并不能从根本上降低开发中大型项目的难度,没有面向对象的继承性和多态性,js工厂模式便被应用到很多项目开发中。工厂模式的核心是:在函数内创建一个对象,给对象赋予属性及方法再将对象返回,例:

        // 创建工厂(类似于生产模具)
        function cat(name,color) {
            var c = new Object();
            c.name = name
            c.color = color
            c.do = function() {
                console.log(this.name + "的颜色是" + this.color + ",它正在吃鱼!")
            }
            return c
        }
        // 生产一只白猫
        var whiteCat = cat("小白", "white")
        // 看看这只猫现在在做什么
        whiteCat.do()          // 小白的颜色是white,它正在吃鱼!
  4. 有了工厂模式,就可以批量“生产”我们需要的对象了,解决了创建多个相似对象的问题。但是也只限于生产对象,无法识别对象的类型。相比这一点儿,构造函数模式就做的好得多了

    // 创建函数构造器,函数名首字母要大写
    function Cat(name, color) {
       this.name = name
       this.color = color
       this.do = function() {
           console.log(this.name + "的颜色是" + this.color + ",它正在吃鱼!")
       } 
    }
    // 用函数构造器实例化一个对象
    var blackCat = new Cat("大黑", "black")
    // 看看这只猫现在在做什么
    blackCat.do()       // 大黑的颜色是black,它正在吃鱼!
    // 判断blackCat是否是Cat的实例,即解决了工厂模式中不能
    console.log(blackCat instanceof Cat)    // true 
    
  5. 构造函数相比于工厂模式有了很大程度的改进,两者差异希望读者根据我的示例自己比较。构造函数的缺点是每次实例化一个对象都会把构造器里的所有方法重新创建一次,多次创建会造成内存开销增加的问题。基于这个问题,利用js的原型和原型链来改进:

        // 测试下原型构造器的使用方法:
        function test() {
            this.do = function() {
                console.log("do something.")
            }
        }
        test.prototype.done = function () {
            console.log('我已经做完了作业!')
        }
        console.log(test === test.prototype.constructor)        // true, 说明test的原型的构造器就是test,那么test的方法是不是在test的原型构造器上也有呢,向下看
        console.log(test.do === test.prototype.constructor.do)      // true
        var a = new test()
        console.log(a.done === test.prototype.done)     // 反过来,test也可以调用定义在test的原型链上的方法
        a.do()
        a.done()
        test.prototype.do = function () {
            console.log('我在做作业!')
        }
        test.prototype.done = function () {
            console.log('我饭都吃完了,你还在做作业啊!')
        }
        var b = new test()
        b.do()  // 原型上的方法不能改写构造器内部的方法
        b.done()    // 原型上的方法可以改写原型上的同名方法
    
        // 进入正题: 将Cat构造器内的方法都放到原型上去
        function Cat(name, color) {
            this.name = name
            this.color = color
        }
        Cat.prototype.do = function() {
            console.log(this.name + "的颜色是" + this.color + ",它正在打怪!")
        }
    
        // 实例化一个对象
        var blueCat = new Cat("蓝猫", "blue")
        // 看看这只猫现在在做什么
        blueCat.do()       // 蓝猫的颜色是blue,它正在打怪!
        console.log(blueCat instanceof Cat)    // true
  6. 原型模式实例化对象时,只需要实例化对象的属性即可,原型上的方法会被实例对象的调用,而不会在实例化时去重复创建
  7. 基于原型模式的对象的继承,只能继承构造器内部的方法,不能继承原型链上的方法:

        function Cat(name, color) {
            this.name = name
            this.color = color
        }
    
        Cat.prototype.do = function() {
            console.log(this.name + "的颜色是" + this.color + ",它正在打怪!")
        }
    
        function RedCat(name, color) {
            Cat.apply(this,arguments)
        }
    
        var blueCat = new Cat("蓝猫", "blue")
        var redCat = new RedCat("虹猫", "red")
    
        console.log('redCat的颜色 ' + redCat.color)    // redCat的颜色 red
        blueCat.do()
        redCat.do() // TypeError: redCat.do is not a function
    
  8. 尽管这比以前更好,但是它仍然不能满足人们对于简洁的JavaScript面向对象解决方案的渴望。这就引入了构造函数的语法糖 ==> ES6的CLASS类:让js的面向对象变得更简单

ES6的class

  1. 一个简单的,基本的class类的实例

        // 类的声明
        class Cat{
            constructor(name, color) {
                this.name = name
                this.color = color
            }
    
            feature() {
                console.log(this.name + "的颜色为" + this.color)
            }
    
            like() {
                console.log(this.name + "喜欢吃鱼")
            }
        }
    
        // 类的实例化
        let whiteCat = new Cat("小白", "white")
        whiteCat.feature()      // 小白的颜色为white
        whiteCat.like()         // 小白喜欢吃鱼
  2. 跟java、c++相同,js的类也具有继承(extends)、父类实例(super)、子类(subclass)、静态方法(static)、get取值和set存值等。class也具有js的一些新特性,例如,类的方法名可以是表达式、类的定义也支持表达式形式,表达式形式的定义可以写出立即执行的类

        // 类的继承
        class LittleCat extends Cat{
            constructor(name, color, age){
                super(name, color)  // 子类的构造器中必须先调用super()方法,然后再使用this,否则会报错
                this.age = age
            }
    
            fish() {
                console.log(this.name + "只有" + this.age + "大,但是他的梦想是去钓鱼")
            }
    
            static readBook() {     // 静态方法不能被实例化,只能由类本身调用
                console.log("动漫世界的小猫都不喜欢看书!")
            }
    
            set mouse(value) {
                this.mouse = value
            }
    
            get mouse() {}
        }
    
        let spiritCat = new LittleCat("精灵猫", "yellow", "三个月")
        spiritCat.like()            // 精灵猫喜欢吃鱼
        spiritCat.fish()            // 精灵猫只有三个月大,但是他的梦想是去钓鱼
        LittleCat.readBook()        // 动漫世界的小猫都不喜欢看书!
        // spiritCat.readBook()        // TypeError: spiritCat.readBook is not a function
        LittleCat.mouse = 10
        console.log(LittleCat.mouse)    // 10
    
        // 类区别函数,不存在变量提升
        let danny = new Person()        // ReferenceError: Person is not defined
        class Person{}
    
        let serverName = "webServer"
        // 表达式形式定义类,此处真正的class名字是server,ser只能在server类内部使用
        const server = class ser{
            constructor(port) {
                this.port = port
            }
    
            // 表达式作为方法名
            [serverName]() {
                console.log("服务器名称为: " + serverName)
            }
    
            start() {
                server.listen(this.port)
                console.log('server is started at port ' + this.port)
            }
        }
    
        // 表达式形式的立即执行类
        const server = new class{
            constructor(port) {
                this.port = port
            }
    
            // 表达式作为方法名
            [serverName]() {
                console.log("服务器名称为: " + serverName)
            }
    
            start() {
                // server.listen(this.port)
                console.log('server is started at port ' + this.port)
            }
        }(8080)
    
        // 此处的server就是一个立即执行类
        server.start()      // server is started at port 8080
  3. ES7新增class的静态属性(es6没有静态属性的写法),运行需要通过babel转码:

        class school{
            // 实例属性的写法
            students = 300
            // 静态属性的写法
            static grade = 6
    
            constructor() {
                console.log("学生总数 " + this.students)
                console.log("开设的年级总数 " + school.grade)
            }
    
            schooltime() {
                // ...
            }
        }

先到这里吧,更深层次的还没学好,学来主要是实用就好~~,我们下期见

JavaScript对象创建模式全解析:从工厂模式到ES6 Class 在JavaScript编程中,对象创建是核心基础概念,它直接关系到代码的可维护性和内存效率。理解对象创建的原理,关键在于掌握原型链机制和构造函数的工作方式。从技术价值看,合理的对象创建模式能显著提升代码复用性、降低内存消耗,并支持更清晰的类型识别。在实际应用场景中,开发者需要根据需求选择合适模式:简单配置对象适合字面量创建,批量相似对象适用工厂模式,而需要严格类型体系和共享方法时,则应采用构造函数与原型组合模式。本文聚焦于JavaScript对象创建,深入探讨了工厂模式、构造函数模式、原型模式等经典模式,并 阅读详情

相关推荐

JavaScript对象创建模式:从构造函数到工厂模式与原型链原理

在JavaScript编程中,对象创建是构建应用的基础。理解对象创建模式的核心原理,能帮助开发者编写更高效、可维护的代码。从最基本的构造函数模式出发,通过new操作符创建对象实例,但需警惕方法重复创建导致的内存浪费问题。原型机制则提供了共享属性和方法的解决方案,通过原型链实现继承,这是JavaScript实现代码复用的关键技术。在实际工程中,组合使用构造函数与原型模式成为经典实践,既保证了实例的独立性,又实现了方法的共享。工厂模式进一步解耦了对象的创建过程,提升了代码的灵活性和可维护性,特别适合在复杂应用架

weixin_34128839的博客 407

JavaScript设计模式:六、工厂模式

JavaScript设计模式:六、工厂模式 文章目录JavaScript设计模式:六、工厂模式一、概述1. 简单工厂模式一、ES6 Class实现二、原型实现2. 复杂工厂模式1) ES5原型实现2) es6-new.target属性的正确用法new.target属性实例3)ES6实现 一、概述 1. 简单工厂模式 一、ES6 Class实现 大白话:通过不同的参数由工厂的构造函数返回不同对象。 工厂模式,通过传入不同短参数达到实例化不同的对象这一目的。比如: 有一天你去餐厅想吃宫保鸡丁,然后餐厅给你实

SpringWaterLikeMe 1169

JavaScript class本质:ES6类是原型的封装而非替代

JavaScript中的class并非面向对象语言中传统意义上的类,而是基于原型(prototype)机制的一层语法封装与行为约束。其核心原理在于将构造函数、原型链操作和继承逻辑标准化,提升代码可读性、协作安全性和调试体验。技术价值体现在强制new调用、初始化顺序保障(super优先)、静态/实例成员内存隔离等工程优势。典型应用场景包括Vue/React组件状态管理、表单验证体系构建、TypeScript类型增强以及跨框架复用的业务逻辑抽象。理解class与prototipos、herencia的内在统一性

weixin_34326558的博客 507

JavaScript 设计模式学习第九篇- 抽象工厂模式

工厂模式 (Factory Pattern),根据输入的不同返回不同类的实例,一般用来创建同一类对象。工厂方式的主要思想是将对象的创建与对象的实现分离。 抽象工厂 (Abstract Factory):通过对类的工厂抽象使其业务用于对产品类簇的创建,而不是负责创建某一类产品的实例。关键在于使用抽象类制定了实例的结构,调用者直接面向实例的结构编程,从实例的具体实现中解耦。 我们知道 JavaSc..................

分享前端工程化、AI 应用、Agent 开发与大模型实践! 1165

手把手教你使用ES6的类与继承:零基础入门必看

深入浅出讲解ES6中类的定义与继承机制,帮助初学者快速理解es6语法的核心概念,通过实例演示实现对象的继承与方法重写,让面向对象编程更直观易懂。

weixin_35636570的博客 614

ES6 类语法:JavaScript 的现代化面向对象编程

Hi,我是布兰妮甜!掌握过去,才能创造未来。理解 JavaScript 的根基与进化,使我们能够构建更强大、更高效的网络应用。本文将深入探讨 ES6 类语法的各个方面,包括基本用法、静态成员、继承机制以及更多高级特性。

chaosweet的博客 1846

JS设计模式之工厂模式

JS设计模式之工厂模式 工厂模式大体分为三类: 简单工厂模式、 工厂方法模式、抽象工厂模式。三者之间的关系,也是渐进式的,抽象化的范围也是越来越高。 1. 简单工厂模式: 对同一类对象创建过程的抽象,在形式上它仅仅只是简单的通过 switch 等判断语句,根据不同条件去生成不同对象,且只能创建现有的数据,如果要添加,必须手动添加。 interface IPhone { name: string; price: number; } enum Phones { hw, mi } /

weixin_44051815的博客 2512

【KDD2024】ShapeFormer:用于多元时间序列分类的Shapelet Transformer

多元时间序列分类(MTSC)因其在现实世界中的广泛应用而吸引了大量研究关注。最近,Transformer在MTSC中取得了先进的性能。然而,

m0_52597077的博客 4747

浅谈几种js设计模式

JavaScript设计模式是开发中常用的一种解决方案,它们帮助开发者以一种更结构化、更易维护的方式编写代码。本文将深入介绍几种常见的JavaScript设计模式,包括单例模式、工厂模式、观察者模式和策略模式。

fie8889的博客 238

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 294

半桥LLC谐振变换器及同步整流MATLAB仿真(二)

接上文,半桥LLC谐振变换器及同步整流MATLAB仿真

qq_55203246的博客 4331

JS设计模式——工厂模式

什么是工厂模式? 工厂模式(Factory Pattern)是创建型设计模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来创建对象。 简单工厂模式 假如有一个屏幕生产工厂,生产各类屏幕。每类屏幕都是一个类,如下,我们通过屏幕工厂类提供的 createScreen 统一接口来创建屏幕对象。这便是一个简单工厂模式的应用。 // 屏幕工厂类 class Scre...

userkang的博客 1824

鼎捷T100——二次开发:维护作业添加非实体字段

非实体字段添加

weixin_52342654的博客 1160

JavaScript类与继承

JS类与继承前言类ES5定义类工厂模式构造函数模式原型模式组合使用构造函数模式与原型模式(最常用)动态原型模式寄生构造函数模式稳妥构造函数模式ES6定义类继承ES5的继承ES6的继承 前言 在ES6中出现了class与extends关键字,使js做类与继承容易了很多,但是在ES6之前如何实现类与继承是理解js重要的一部分。本篇文章将介绍ES6的类、继承与ES6之前的类、继承的写法,一篇文章介绍所有内容。 类 下面定义的类全部为Person类,Person类有age与name两个属性,sayName与sayA

小刘的博客 615

Mybatis Provider注解实现批量插入

需求 借助mybatis 的provider实现一个比较通用的,批量插入数据接口。 Mapper接口 第一参数为需要批量插入的数据,第二个参数为对应实体类的class public interface BaseDao<T> { @InsertProvider(type = BaseProvider.class, method = "batchInsert") int batchInsert(@Param("lists") List<T&gt

小楼夜听雨的博客 2420

【06】新国都——新国都 嵌入式笔试,校招,题目记录及解析

本文总结了新国都嵌入式校招笔试题目及解析,内容涵盖C语言基础、Linux系统、数据结构与算法等多个方面。主要包括:1)不定项选择题10道,涉及字符串常量、蓝牙与GPRS区别、编译错误识别等;2)判断题10道,考察Linux权限、循环控制、内存管理等;3)填空题5道,包括编码计算、逻辑运算、宏定义等;4)简答题2道,解析全局变量引用和进程线程区别。题目难度适中,重点考察嵌入式开发基础知识和编程能力,并提供详细解析和扩展知识链接,对准备嵌入式相关笔试具有参考价值。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1435

前端学习之JS(三)

前端学习笔记们之js高级

weixin_53105591的博客 156

【Mode】Mode expansion monitors

对于宽带仿真,因为被支持的模式可能是波长的函数,因此,推荐在波长范围内增加频率的采样点数量去计算支持的波导模式分布或者光纤模式分布。对于宽带仿真,如果在被计算模式上的频率点的数量与通过 frequency-domain monitors 被测量的频率点的数量不匹配,这种情况是正常的。Mode expansion monitors 对于仿真偏振转换器是十分有用的,比如,在偏振转换器中,当你想要提取从输入模式到输出模式的转换效率,或者提取一个装置的 S 参数。给出了进入到被选择模式中的合透射率,

u011699626的博客 2763

js中对象属性、面向对象、面向过程、类、继承、以及原型原型链

对象字面量 对象字面量是对象定义的简写形式,目的是为了简化包含大量属性的对象的创建。 也可以使用字符串、数字、bool类型来定义。 但要注意此类情况(后值覆盖前值): 访问/设置方式 configurable(可配置) 表示属性是否可以通过删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 。 enumerable 表示属性是否可以通过循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是。 writable 表示属

ch2362710931的博客 467

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现(完结,附带项目源码)

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4657

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

一文详解-JavaScript中 es5 原型和 es6-class

有不少小伙子应该会有这个感觉 大家都在说原型 很重要,那为什么我却用不到?原因不外乎这几个:于是乎,既然用不到,那就不用学,从自我做起,拒绝内卷。理解满分。。。。然而残酷的真相是,只有技术是自己可以实实在在的去把控的,命运还是掌握在自己手中。刚刚想撸起袖子好好干, 一看这个神图。 “算了,上号吧”。下面小弟尽量以最直白和简洁的图文给你梳理 ese5 和原型之间的关系。封装!!! 当我们想抽象某些公共业务 方便复用或者使结构更加清晰的时候便会用到。 面向对象三大特征:比如 我们想创建一个我们会这么写如果 我

不懂先生的博客 1220

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JS中关于类定义几种定义以及ES6的class

这里写自定义目录标题关于js的类和继承的一些小见解创建对象工厂函数模式 ,**构造函数模式**原型模式创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 关于js的类和继承的一些小见解 这是我学习js的一点点小的体会和心得,可能会有一些不对的地方欢迎提出,谢谢 创建对象 js是一中弱类型的语言,他的类的创建时多种多样的,在ES5中,没有正式支 持面

qq_43760774的博客 374

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

现代JavaScript类Class:面向对象编程的ES6终极指南

现代JavaScript类(Class)是ES6引入的重要特性,为开发者提供了更简洁、更清晰的面向对象编程语法。本文将从基础概念到高级应用,全面解析JavaScript类的使用方法,帮助你快速掌握这一核心知识点。 ### 为什么需要JavaScript类? 在ES6之前,JavaScript通过原型链实现对象继承,代码结构不够直观。类的出现让面向对象编程更加符合开发者的思维习惯,同时保持了Ja

gitblog_00842的博客 349

ES6-learning:类和面向对象编程的完整指南

欢迎来到ES6-learning项目的终极教程!🎯 今天我们将深入探讨JavaScript ES6中最激动人心的特性之一——类和面向对象编程。如果你是JavaScript开发者,想要掌握现代前端开发的核心技能,那么这篇完整指南正是为你准备的! ES6(ECMAScript 2015)为JavaScript带来了真正的类语法,彻底改变了我们编写面向对象代码的方式。在ES6之前,JavaScrip

gitblog_00598的博客 745

JavaScript早期(ES6之前)对象及其的属性和方法的访问介绍

JavaScript如何访问对象的属性和方法介绍。要讲解如何访问对象的属性和方法,需要有对象,因此需要和创建对象一起讲解。

cnds123的专栏 3545

面向对象 OOP es6 Class 类

面向对象编程 (Object Oriented Programming) 单例设计模式 单例模式解决的问题 高级单例模式 基于单例模式实现模块化开发 工厂模式 单例设计模式 1、表现形式 (对象) var obj = { xxx:xxx }; 2、作用 把描述同一件事务的属性和特性进行 分组,归类(存储在一个堆内存空间中)。因此避免了全局变量之间的冲突和污染 var pa...

爱睡的虫虫 361
上一篇: nuxt 踩坑之 -- Vuex状态树的模块方式使用
下一篇: 自己动手开发Vue插件(之一)Vue插件之公共方法封装
EricLua
博客等级 码龄9年 34粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值