ES6 class类的静态方法static有什么用

        在项目中,工具类的封装经常使用静态方法。

// amap.jsimport AMapLoader from '@amap/amap-jsapi-loader';
import { promiseLock } from '@triascloud/utils';
/*** 高德地图初始化工具*/
class AMapHelper {static getAMap = window.AMap? window.AMap: promiseLock(AMapHelper.setLoader, {keyGenerator: () => 'AMapHelper',forever: true,global: true,});static async setLoader() {return await AMapLoader.load({key: process.env.VUE_APP_AMAP_API_KEY,version: '2.0',plugins: ['AMap.Geocoder','AMap.Geolocation','AMap.PlaceSearch','AMap.CitySearch','AMap.AutoComplete','AMap.Scale','AMap.ToolBar','AMap.MapType','AMap.DistrictSearch',],AMapUI: {plugins: ['misc/PositionPicker'],},});}
}
export default AMapHelper;

        这里用class并不是让我们去生成AMapHelper实例,就算你生成实例,你也无法调用里面的static方法(静态方法无法被实例调用)。只能通过AMapHelper .getAMap 直接调用。为什么这么写呢?一是无需要实例化即可调用方法,节约了内存空间。二是无法被实例继承,也不会收到实例数据影响。保证了隐秘和私密性。

        

静态方法常用场景       

        那静态方法有什么用呢?其实,我们平时的经常有用到,比如 JS 内置的 Object.keys(),Object.assign(), Array.isArray(), Number.isNaN(), Number.isIntege() ,还有楼下有人提到的 Promise.all() 等等都是静态方法,再比如框架 vue 或 jQuery 的 Vue.extend() 或 $.extend() 等也是静态方法。

        那为什么原生对象或框架(类库)会提供一些静态方法呢?开头已经讲过了,静态方法是不需要实例化的,如果你 new 一个实例就会占用一块新的内存,所以目的就是为节省内存。

        那非原生对象为什么要提供静态方法呢?一般使用场景是作为命名空间使用

         当你定义的方法不需要通过 this 访问实例,换句话说并不依赖于具体的实例,并且和类强相关时,可以封装成类的静态方法。当然这个方法可以直接定义在类外面,只不过封装到类里面更符合开闭原则,直接点的好处就是通过类名访问静态方法不会污染外层环境

        是不是难以理解,我们来看个例子:

Date.now() 和 Date.prototype.getTime()

        两者都是返回时间戳

        区别就在于 Date.now() 返回当前的时间戳,而 Date.prototype.getTime() 返回实例化 Date 对象时,指定的某个时间的时间戳。

console.log(Date.now()) // 返回当前的时间戳
console.log(new Date('Jan 1, 1970 00:00:00 GMT+00:00').getTime()); // 返回 1970-1-1 00:00.. 的时间戳

        实例方法的返回值是基于当前实例对象里面的数据的,即有副作用的产生。而你使用静态方法时,除了输入-输出,没有这么一个相当于”环境变量“的 context,就少了很多灵活性。但从而又使得代码调用变得更简单,所以几乎所有的静态方法都可以作为全局方法来调用。

静态方法的特点

        ①不需要创建实例调取

        ②在静态方法中 this 是指向类本身

class Foo {static methods(){console.log(this.b)}
};
Foo.b = '3'
Foo.prototype.b = '33'
Foo.methods() // '3' 

        ③仅能调用该类上的其他的 static 方法和staic属性

class Foo {bcd = 44;static abc = 33;static methodsbcd(){console.log(this.bcd)}static methodsabc(){console.log(this.abc)}
};
Foo.methodsbcd // undefined
Foo.methodsabc // 33

        ④不能以任何方式引用 this 或 super,即静态方法不具备面向对象的可继承性

class A {x = 1;print() {console.log(this.x);}
}
class B extends A {x= 2;m() {super.print();}
}
var a = new B()
a.m() // 2

           如果调用static方法        

        在js里边 function是一等公民,而且class其实就是构造器本身,构造器也是function,只不过是配合了原型的语法糖。静态方法其实就是function上带一个function的成员       

 

一些别的看法

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

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

相关文章

kafka顺序读写磁盘分析

Kafka是一种流行的分布式消息系统,它具有高吞吐量、可扩展性和可靠性等特点。其中一个重要的技术特点是它能够保证消息的顺序写磁盘,从而保证了消息的顺序性和一致性。本文将从Kafka服务端源码的角度,对Kafka实现顺序写磁盘的原理进行分析&am…

c语言:通讯录管理系统(动态分配内存版)

前言:在大多数高校内,都是通过设计一个通讯录管理系统来作为c语言课程设计,通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来,可以很好的锻炼学生的编程思维,本文旨在为通讯录管理系统的设计提供思路和…

山海鲸汽车需求调研系统:智慧决策的关键一步

随着社会的发展和科技的进步,汽车行业也迎来了新的挑战和机遇。如何更好地满足用户需求、提高产品竞争力成为了汽车制造商们关注的焦点。在这个背景下,山海鲸汽车需求调研互动系统应运而生,为汽车行业赋予了智慧决策的力量。 智慧决策的核心&…

Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Idea中执行任务时,没法看到JobManager的错误,以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中,增加日志,发现jdbc连接被关闭了。 重新…

redis 主从复制

配从不配主 主要开启密码 在redis.conf requirepass xxxx 在从机配置 查看主从关系 在主机或从机执行 info replication 注意点 从机可以读,但没有写的权限主从机同时启动, 主机写一个命令,从机复制一个命令 主机开启动,写入命…

【智慧燃气】智慧燃气解决方案总体概述--终端层、网络层

关键词:智慧燃气、智慧燃气系统、智慧燃气平台、智慧燃气解决方案、智慧燃气应用、智能燃气 智慧燃气解决方案是基于物联网、大数据、云计算、移动互联网等先进技术,结合燃气行业特征,通过智能设备全面感知企业生产、环境、状态等信息的全方…

linux下Qt的pro文件

生成生成文件后缀名的说明。这只是泛泛而谈,实际发现跟编译器有关。比如在windows系统上用MinGW,可能静态库还是a后缀。 文件静态库动态库目标文件LINUXasooWINDOWSlibdllobj 在.pro文件中,INCLUDEPATH用于引入外部库的头文件,L…

嵌入式面试:大疆 2023 春招

文章目录 一、笔试SPI的四种模式:模式0 (CPOL0; CPHA0)模式1 (CPOL0; CPHA1)模式2 (CPOL1; CPHA0)模式3 (CPOL1; CPHA1) 一、笔试 SPI的四种模式: CPOL (Clock POlarity):决定时钟极性 CPHA (Clock PHAse):决定时钟相位 modeCP…

Ubuntu 22.04 clang++ /usr/bin/ld: 找不到 -lstdc++: 没有那个文件或目录

/usr/bin/ld: 找不到 -lstdc: 没有那个文件或目录 clang-16: error: linker command failed with exit code 1 (use -v to see invocation) 解决 sudo apt install libstdc-12-dev

Linux ❀ 磁盘IO较大故障告警排查确认方法

文章目录 1、iotop2、iostat3、磁盘压力测试 问题描述:在日常运维工作中,经常会遇到Linux服务器出现Disk磁盘I/O( I/O 英文全称是 Input/Output,中文译为 输入与输出,通常指存储器与其他设备之间的数据交换操作&#x…

Rn使用FlatList导航栏自动回到中间

import { useState, useRef } from react import { FlatList, View, Text, StyleSheet, TouchableOpacity } from react-nativeconst Center () > {const tabs ["语文", "数学", "英语", "政治", "历史", "地理&q…

工学云打卡签到自动实现关于异地时定位的问题解决|蘑菇钉

工学云打卡助手,能解决你在异地时每天不间断签到的问题,仔细看图哦 1.自动签到 2.自定义打卡地区 3.生成日周月报与总结自动发表 4.支持随机通用内容 5.支持打卡结果推送 你是否曾经因为缺乏自律而无法坚持学习目标?是否曾经因为无法衡量…

分布式文件服务器——初识MinIO

开篇 MinIO ——开源优秀的分布式对象存储系统。 适用于AI的 高性能分布式云存储 MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的私有云储存服务。 MinIO原生支持 Kubernetes,它可用于每个独立的公共云、每个 Kubernetes 发行版、私…

C++: 继承

学习目标 1.继承的概念及定义 2.基类和派生类对象赋值转换(切片) 3.继承中的作用域(隐藏/重定义) 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.菱形继承与菱形虚拟继承 8.总结 1.继承的概念及定义 1.1概念 继承: 它允许你创建一个新的类(称为子类或派…

数据结构之堆的实现

首先我们要想堆应该用什么实现,我们这里可以使用数组,因为每一层的数是有限个的,所以我们可以很容易将数的每一个位置对应到数组中去。 那我们就可以仿照顺序表写出我们的结构。 然后我们要考虑我们要实现哪些函数。 最基本的功能初始化和销…

rabbitmq查看节点信息命令失败

不影响访问rabbitmq,但是无法使用 命令查看节点信息 等 查看节点信息命令:rabbitmq-diagnostics status --node rabbitJHComputer Error: unable to perform an operation on node ‘rabbitJHComputer‘. Please see diagnostics informatio rabbitmq-…

ssm+vue的台球厅管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的台球厅管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring S…

服务器数据恢复-V7000存储2块磁盘故障脱机的数据恢复案例

服务器数据恢复环境: P740AIXSybaseV7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。 服务器故障: 存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘数据同步到40…

C++练习题。。。

499 123 456 789 499是三位数 <499的素数有: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 …

遥感云大数据在灾害、水体与湿地领域典型案 例实践及 GPT 模型应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…