我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "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. yb课堂 ECMAScript 6常见语法快速入门 《三十一》

    什么是ES 6 ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015).它的目标是使用JavaScri ...

  2. react懒加载,减少首屏加载时间

    最近在写一个react-ant-admin的集成框架用于快速搭载中后台项目.其中遇到很多问题,最重要的应该是访问速度了.我就想 react 可不可以和 vue 一样用路由懒加载来减少首页渲染所花费的时 ...

  3. 用户数据报协议UDP

    UDP的首部格式如下: (1) 源端口,源端口号.在需要对方回信时选用.不需要时可用全0. ⑵目的端口,目的端口号.这在终点交付报文时必须使用. ⑶长度,UDP用户数据报的长度,其最小值是8(仅有首部 ...

  4. Jmeter函数助手10-regexFunction

    regexFunction函数用于对上一个请求进行正则表达式提取处理,类似正则表达式. 用于从前一个请求搜索结果的正则表达式:填入正则表达式 Template for the replacement ...

  5. [香橙派开发系列]3b系统安装和使用vscode进行远程连接

    目录 前言 一.下载镜像和安装系统 二.使用串口助手进行调试 三.查看系统的ip地址 四.使用vscode连接香橙派 最后 前言 之前研究中断的时候一直出现问题,我怀疑是因为zero 3不支持,所以一 ...

  6. 对比python学julia(第三章:游戏编程)--(第三节)疯狂摩托(3)

    3.3.    编程实现 2.  控制摩托车和箱子 在这个步骤中,将编程控制摩托车和箱子角色的运动,让摩托车在沙漠公路上能够加速或减速行驶,在碰到箱子时能够停止,以及显示麾托车的行驶速度和里程等. ( ...

  7. Cesium 实现可视域分析

    *前言:尝试了网上好多个版本的可视域分析,感觉都有一些问题,我这个也可能不是最完美的,但是我觉得对我来说够用了,实现效果如下* 此示例基于vue3上实现,cesium版本1.101.0 ,vite-p ...

  8. 【H5】10 嵌入技术

    到目前为止,您应该掌握了将图像.视频和音频嵌入到网页上的诀窍了. 此刻,让我们继续深入学习,来看一些能让您在网页中嵌入各种内容类型的元素: <iframe>, <embed>  ...

  9. 【转载】逐际动力双足机器人P1在深圳塘朗山零样本、无保护、全开放完成测试

    原文: https://weibo.com/1255595687/O5k4Aj8l2 [逐际动力双足机器人P1在深圳塘朗山零样本.无保护.全开放完成测试] 上周,就在全球AI界被美国初创公司Figur ...

  10. vue之element图标库使用与第三方阿里云图标库使用

    1.背景 2.element图标库使用 假设要做一个如下效果 代码如下: <!-- 输入框--> <el-form label-width="0px" class ...