从前有匹马叫代码
心若没有栖息的地方,到哪里都是流浪
posts - 81,comments - 3,views - 22109

我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "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教程》- 静态属性和静态方法

 

posted on   从前有匹马叫代码  阅读(1452)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示