我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype" 。这样的方法被称为 静态的(static)。

例如这样:

class Animal {
static staticProperty = 'staticProperty'
static staticMethod() {
console.log('staticMethod');
}
}

它们等价于这样:

class Animal {}
Animal.staticProperty = 'staticProperty';
Animal.staticMethod = function() {
console.log('staticMethod')
}

在静态方法中 this 指向 当前类

class Animal {
static staticProperty = 'staticProperty'
static staticMethod() {
console.log(this === Animal);
}
} Animal.staticMethod();//true

静态属性和方法是可被继承的

class People {
static homeland = '中国';
static staticMethod() {
console.log(`${this.homeland}-${this.name}`);
}
} class Peng extends People {
static name = '谢展鹏';
} Peng.staticMethod();//中国-谢展鹏

为什么静态属性是可继承的,extends 到底做了什么?

当我们使用 extends 来实现继承时,它做了两件事:

  1. 在构造函数的 "prototype" 之间设置原型(为了获取实例方法)
  2. 在构造函数之间会设置原型(为了获取静态方法)

让我们来验证一下:

class Animal{
static staticProperty = 'static Property';
static staticMethod() {
console.log('staticMethod');
}
run() {
console.log('I\'m running!');
}
} class Rabbit extends Animal{} console.log(Rabbit.__proto__ === Animal);// true
Object.keys(Rabbit.__proto__).forEach(k=>console.log(k)); //staticPropert new Rabbit().run(); //I'm running! console.log(Rabbit.prototype.__proto__ === Animal.prototype);//true //解释一下: 因为 const rabbit = new Rabbit() 实例并没有run方法,所以实例在原型链上查找,大概顺序是这样的
// rabbit -> rabbit.__proto__(Rabbit.prototype) -> rabbit.__proto__.proto__(Animal.prototype)

在JS中所有函数的默认__proto__都是Function.prototype,对于内建的 Object 构造函数而言,Object.__proto__ === Function.prototype

推荐阅读 :《现代JavaScript教程》- 静态属性和静态方法

JavaScript中class的静态属性和静态方法的更多相关文章

  1. php面向对象中static静态属性和静态方法的调用

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态 ...

  2. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  3. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  4. PHP面向对象——静态属性和静态方法

    静态属性 所谓静态属性,也就是这个属性对于这个类来说是唯一的,不管有多少个对象,只要它引用了一个静态对象,那么这些对象引用出来的值肯定是同一个. 静态变量不能使用->这种箭头符号,而是使用::这 ...

  5. php静态属性和静态方法

    php静态属性和静态方法 2012-09-29 10:18 1518人阅读 评论(0) 收藏 举报 phpfunction 本php教程主要是学习php中静态属性和静态方法的使用方法和基本的示例. · ...

  6. static静态属性和静态方法的原理与调用技巧

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下     本文实例讲述了php中static静态属 ...

  7. PHP使用static关键字声明静态属性和静态方法

    PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...

  8. JavaScript中的方法和属性

    书读百遍其义自见 学习<JavaScript设计模式>一书时,前两个章节中的讲解的JavaScript基础知识,让我对属性和方法有了清晰的认识.如下是我的心得体会以及部分摘录的代码. 不同 ...

  9. Java基础学习笔记-类的静态属性和静态方法--待继续补充

    程序运行时的内存占用 代码区(code area) 存放代码 数据区(data area) 存放全局数据.静态数据 堆区(heap area) 存放动态申请的数据 栈区(stack area) 存放局 ...

  10. JavaScript中的可枚举属性与不可枚举属性

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. 一.怎么判断属性是否可枚举 js中基本包 ...

随机推荐

  1. oeasy教您玩转vim - 23 - 配置文件

    配置文件 回忆上节课内容 我们上次找到配置文件的位置 ~/.vimrc 了解各种配置开关 修改配置文件并应用 这次想了解和配色方案相关的内容 colorscheme vi ~/.vimrc.old 中 ...

  2. c语言的编译与调试

    1. GCC/G++ gcc和g++是GNU Compiler Collection中的编译器,分别用于编译C和C++程序.它们的编译过程主要包括四个步骤:预处理(Pre-Processing).编译 ...

  3. Linux中&&、&、|、||等特殊符号

    && 和 & & 表示任务后台执行,与nohup命令功能差不多. # 运行jar包,并且置于后台执行,执行的日志重定向到当前默认的log.txt文件中 [root@lo ...

  4. CentOS-7离线安装net-tools

    1.下载相关安装包 CentOS-7 所有rpm包的仓库地址:https://vault.centos.org/7.9.2009/os/x86_64/Packages/ net-tools-2.0-0 ...

  5. 【ElasticSearch】03 部署

    Windows集群部署: 把包解压成三个节点 [kibana-7.16.3-windows-x86_64.zip] - Node-1001 - Node-1002 - Node-1003 修改集群的配 ...

  6. 【Maxwell】01 安装及入门

    官网地址: https://maxwells-daemon.io/ 下载地址(版本发行): https://github.com/zendesk/maxwell/releases 参考教程自尚硅谷视频 ...

  7. 【MySQL】Windows-5.7.30 解压版 下载安装

    1.Download 下载 mysql官网: https://dev.mysql.com/ 找到download点击进入下载页面: https://dev.mysql.com/downloads/ 找 ...

  8. jax框架的官方编译版本 —— 预编译发行版本(release 列表)

    jax框架的Google官方给出的预编译版本,支持CUDA和CUDNN的,带有python版本号,CUDA版本号,CUDNN版本号的: https://storage.googleapis.com/j ...

  9. mendeley存储是有限的吗

    用了mendeley好多年,总是有一个疑问,那就是这东西的云存储空间是不是有限的,如果是有限的话那么上限是多少?这东西不论是app还是桌面端都没有这个空间信息的大小,但是这东西必然是有上限的,那么这个 ...

  10. SSH如何通过proxy进行服务器连接

    openssh是什么这里不做解释,但凡是用过linux系统的一般都是会了解这个的,毕竟openssh都是系统自带的应用. openssh一般都是指linux上的客户端,很多linux系统自有客户端的s ...