JavaScript——为什么静态方法不能调用非静态方法

这篇具有很好参考价值的文章主要介绍了JavaScript——为什么静态方法不能调用非静态方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js 🍖JS版算法
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧


✨✨前言

大家好,这里是前端杂货铺。

前几天在公司做项目的时候发现了一个问题 => 在带 static 关键字的方法里面调用该类中的其他方法,其他方法也需要带 static 关键字。

举个简单的栗子:

class Person {
    static toDo() {
        this.say();
    }
    say() {
        console.log('to say');
    }
}

Person.toDo();

我相信,会有一部分小伙伴认为输出的结果是 to say(和你一样,我一开始也这么认为),但实际的输出结果是:

JavaScript——为什么静态方法不能调用非静态方法,100个疑难杂症,javascript,前端

是的,它报错了,它说 say 不是一个方法,这不胡扯吗?say 怎么可能不是一个方法?!


先别急,我们给 say 方法前面加上 static 关键字让其成为一个静态方法,再看看还会不会报错?

class Person {
    static toDo() {
        this.say();
    }
    static say() {
        console.log('to say');
    }
}

Person.toDo();

JavaScript——为什么静态方法不能调用非静态方法,100个疑难杂症,javascript,前端

很神奇,加上 static 它就不报错了…


✨✨static施了什么魔法

在了解 static 施了什么魔法之前我们先认识一下 static 吧。

在 MDN 上是这样定义static 的:

关键字 static 将为一个类定义一个静态方法。静态方法不是在一个实例之上被调用,而是在类自身之上被调用。它们通常是工具函数,比如用来创建或者复制对象。

(注:“工具函数” 就是指具有某些功能的函数,这些函数(或者叫做方法)就像工具一样,当我们需要它们的时候,就可以使用它们)


我们简单认识了 static 的定义和用途,那么接下来我们来分析一下为什么在方法前加上 static 关键字就不报错呢?

生命周期不同:

静态方法属于类。 静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才被销毁。

非静态方法属于对象。 非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。

所以,当对象不存在时非静态方法也不存在,静态方法自然也就不能调用一个不存在(非静态)的方法。


✨✨知识扩展

现在我们知道了 静态方法不能调用非静态方法,那么非静态方法可以调用静态方法吗?经过我们上述的分析,答案是肯定的!

class Person {
    toDo() {
        Person.say();
    }
    static say() {
        console.log('to say');
    }
}

let person = new Person();
person.toDo();

JavaScript——为什么静态方法不能调用非静态方法,100个疑难杂症,javascript,前端


尺有所短寸有所长,static 当然也不是完美的…

static的优点:

  1. 属于类级别的,不需要创建对象就可以直接使用
  2. 全局唯一,内存唯一,静态变量可以唯一标识某些状态
  3. 在类加载时候初始化,常驻在内存中,调用快捷方便

static的缺点:

  1. 静态方法不能调用非静态的方法和变量.(非静态方法可以任意的调用静态方法/变量)
  2. 不能使用this和super关键字(属于类级别,没有创建对象前不可用this/super)

应用场景:

  1. 静态方法最适合工具类中方法的定义;比如文件操作,日期处理方法等.
  2. 静态方法适合入口方法的定义;如单例模式,因为从外部拿不到构造函数,所以定义一个静态的方法获取对象非常有必要.
  3. 静态变量适合全局变量的定义.(如布尔型静态成员变量做控制符)

静态方法效率上比实例化高,因为静态方法不需要实例化的过程。

当方法被频繁调用时可以考虑使用静态的,可以提高项目性能。如果很少使用尽量不要使用静态方法,以免增加服务器的负担。


🎉🎉本篇小结

本篇文章我们探讨了静态方法。

静态方法属于类级别的,而非静态方法属于对象级别的。通过对 生命周期 的分析,我们理解了静态方法中不能调用非静态方法,而非静态方法中可以调用静态方法的原因。

之后我们对 static 的优缺点进行了列举,对其应用场景有了一定的认识。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. MDN 官方文档
  2. JavaScript 静态方法 【作者:三季人 G】
  3. 百度百科 · 屈原《卜居》

JavaScript——为什么静态方法不能调用非静态方法,100个疑难杂症,javascript,前端文章来源地址https://www.toymoban.com/news/detail-674526.html


到了这里,关于JavaScript——为什么静态方法不能调用非静态方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么MySQL单表不能超过2000万行?

    摘要: MySQL一张表最多能存多少数据? 本文分享自华为云社区《为什么MySQL单表不能超过2000万行?》,作者: GaussDB 数据库 。 最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。 文中提到,他朋友在面试的过程中说,自己的

    2024年02月05日
    浏览(51)
  • 【PDF密码】PDF文件不能打印,为什么?

    正常的PDF文件是可以打印的,如果PDF文件打开之后发现文件不能打印,我们需要先查看一下自己的打印机是否能够正常运行,如果打印机是正常的,我们再查看一下,文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功能按钮以及打印按钮都是灰色的状态,那就证

    2024年02月13日
    浏览(62)
  • mysql的主键索引为什么不能null

    这是一个非常奇怪且有趣的问题。可以通过官方文档进行解读 https://dev.mysql.com/doc/refman/5.7/en/glossary.html A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not

    2024年02月14日
    浏览(75)
  • inline内联函数为什么不能是虚函数?

    1. inline内联函数为什么不能是虚函数? 虚函数可以是内联函数 ,内联是可以修饰虚函数的, 但是当虚函数表现多态性的时候不能内联 。 理由如下:内联是在发生在编译期间,编译器会自主选择内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此

    2024年02月21日
    浏览(56)
  • C++ vector元素类型为什么不能是引用

    vectorT 引用必须要进行初始化,不能初始化为空对象,初始化后不能改变指向 引用是别名,不是对象,没有实际地址, 不能定义引用的指针 ,也 不能定义引用的引用 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储

    2024年02月15日
    浏览(59)
  • springboot~InvocationHandler中为什么不能使用@Autowired

    @Autowired 是 Spring Framework 中用于自动注入依赖的注解,通常情况下可以正常工作,但有一些情况下可能无法获取到 bean 对象: Bean未定义或未扫描到 :如果要注入的 bean 没有在 Spring 上下文中定义或者没有被正确扫描到, @Autowired 将无法找到要注入的 bean。确保你的 bean 配置正

    2024年02月10日
    浏览(58)
  • 为什么 conda 不能升级 python 到 3.12

    弄清楚为什么执行了如下升级命令后, python 版本还是 3.11? 因为 conda forge 没有完成 migration Migration is the process on Conda Forge by which packages get rebuilt to support new global versions, such as Python 3.12 or R 4.3. Conda Forge provides a dashboard to track the status of migrations, such as Python 3.12. 迁移(migration)

    2024年02月05日
    浏览(78)
  • 为什么网络可以ping通,还是不能ssh到目标主机?

      做运维工作,我们都是通过远程的方式去连接一台服务器或者虚拟机,很多初次做运维的朋友可能经常会遇到这样一个问题:我ping目标服务器的IP是通的,但是我通过ssh却不能连上主机。今天,就来浅谈一下,为什么你ping网络是通的,但是却不能连接到远程主机,当你弄

    2024年02月09日
    浏览(55)
  • 为什么分类问题不能使用mse损失函数,更容易理解版本

    分类问题通常不适合使用均方误差(Mean Squared Error,MSE)损失函数,原因如下: 输出差异的度量不同:MSE损失函数是基于预测值和真实值之间的差异的平方和进行计算的,适用于回归问题(建立一个模型来预测连续数值输出的问题, eg: 房价预测;股票价格预测…),其中

    2024年04月26日
    浏览(35)
  • C静态库的创建与使用--为什么要引入静态库?

    C源程序需要经过预处理、编译、汇编几个阶段,得到各自源文件对应的 可重定位目标文件 ,可重定位目标文件就是各个源文件的二进制机器代码,一般是.o格式。比如:util1.c、util2.c及main.c三个C源文件,经过预处理器、编译器、汇编器的处理,就可以得到各自的目标文件u

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包