返回顶部
首页 > 资讯 > 操作系统 >JavaScript——为什么静态方法不能调用非静态方法
  • 121
分享到

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

javascript前端 2023-08-30 11:08:13 121人浏览 八月长安
摘要

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步至千里,积小

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习🍍前端面试宝典 🍉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(和你一样,我一开始也这么认为),但实际的输出结果是:

在这里插入图片描述

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


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

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

在这里插入图片描述

很神奇,加上 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();

在这里插入图片描述


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

static的优点:

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

static的缺点:

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

应用场景:

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

🎉🎉本篇小结

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

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

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

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


参考资料:

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

在这里插入图片描述


来源地址:https://blog.csdn.net/qq_45902692/article/details/132511937

--结束END--

本文标题: JavaScript——为什么静态方法不能调用非静态方法

本文链接: https://lsjlt.com/news/382790.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript——为什么静态方法不能调用非静态方法
    个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步至千里,积小...
    99+
    2023-08-30
    javascript 前端
  • java静态和非静态方法怎么调用
    在Java中,静态方法和非静态方法的调用方式有所不同。 静态方法调用: 静态方法可以直接通过类名来调用,不需要创建类的实例。例如:...
    99+
    2024-04-02
  • java中什么是静态方法和非静态方法
    本篇文章为大家展示了java中什么是静态方法和非静态方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的...
    99+
    2023-06-14
  • C#中静态方法与非静态方法有什么区别
    C#中静态方法与非静态方法有什么区别,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#静态方法与非静态方法比较一、C#静态成员:①静态成员属于类所有,非静态成员属于类的实例...
    99+
    2023-06-17
  • php中静态方法怎么访问非静态方法
    本篇内容主要讲解“php中静态方法怎么访问非静态方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中静态方法怎么访问非静态方法”吧!PHP中静态方法可以访问非静态方法;可以先实例化对象,然...
    99+
    2023-06-29
  • java中静态方法与非静态方法的区别
    静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存中,不自动进行销毁,会一直存在内存中,直到JVM关闭。非静态方法又称实例化方法,属于实例对象,实例化之后才会分配内存,必须通过类的实例来引用,当实例对象被JVM回收之后,也跟...
    99+
    2018-06-09
    java基础 java 静态方法 非静态方法 区别
  • php中静态方法可以访问非静态方法吗
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php中静态方法可以访问非静态方法吗如果我们调用了非静态方法会怎么样呢?首先做测试。<php class test{ function test() {...
    99+
    2021-05-29
    php
  • 无法从静态上下文中引用非静态方法
    原因: 用static修饰的方法称为静态方法,修饰变量则为静态变量,又分别叫做类方法或者类变量。  静态方法中不能直接调用非静态方法。因为非静态方法不是独立存在的,它是依附于对象存在——即只有申明了对象,才能通过对象调用。而静态方法则可以直...
    99+
    2023-09-04
    java
  • java静态方法和非静态方法的区别有哪些
    这篇文章给大家分享的是有关java静态方法和非静态方法的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入...
    99+
    2023-06-14
  • java: 无法从静态上下文中引用非静态 方法
    Java中静态上下文中无法引用非静态变量的解决办法: 一、为什么不能引用? 今天编写代码遇到 non-static variable mainframe cannot be referenced from a static context ...
    99+
    2023-10-08
    java 开发语言
  • c#怎么调用静态方法
    在 c# 中,调用静态方法可以通过两种方式:1. 使用类名直接调用;2. 使用类型名称 + 双冒号调用。 如何在 C# 中调用静态方法 什么是静态方法? 静态方法是不属于任何特定对象实...
    99+
    2024-05-12
    c#
  • c#静态方法怎么调用
    如何在 c# 中调用静态方法?定义使用 static 修饰符的静态方法。直接调用类名.方法名(),无需实例化类。可传入参数,语法为类名.方法名(params type[] paramet...
    99+
    2024-05-14
    c#
  • php为什么要使用静态方法
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php为什么要使用静态方法静态方法不需要所在类被实例化就可以直接使用。静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。静态方法和静...
    99+
    2015-09-04
    PHP
  • php能不能私有静态方法
    这篇文章主要介绍了php能不能私有静态方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php可以私有静态方法。静态私有方法提供了一种从类外部隐藏静态代码的方法;如果几种不同...
    99+
    2023-06-15
  • kotlin怎么调用java静态方法
    在 Kotlin 中调用 Java 的静态方法非常简单,只需要使用 Java 类的全限定名加上静态方法名即可。例如,假设有一个 Ja...
    99+
    2024-04-02
  • 什么是C#静态方法
    本篇内容介绍了“什么是C#静态方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#静态方法是什么呢?在我们编程开发的应用中C#静态方法可以...
    99+
    2023-06-17
  • php中的静态属性和静态方法是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在 PHP 中,通过 static 关键字修饰的成员属性和成员方法被称为静态属性和静态方法,这里可以将它们统称为静态成员,类中的静态成员与类中的一般成员不同,静态成员不...
    99+
    2021-03-06
    php 静态属性 静态方法
  • java中静态方法如何调用
    在Java中,可以通过以下两种方式来调用静态方法:1. 使用类名调用静态方法:可以直接通过类名来调用静态方法,不需要创建类的实例。语...
    99+
    2023-09-14
    java
  • PHP中什么是静态以及静态属性和静态方法是什么意思
    本篇内容主要讲解“PHP中什么是静态以及静态属性和静态方法是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中什么是静态以及静态属性和静态方法是什么意思”吧!静态是什么我们之前讲到,...
    99+
    2023-06-20
  • Java 中的静态字段和静态方法
    目录一、静态变量静态变量声明静态变量测试二、静态方法静态方法测试静态方法是如何工作的为什么 Java Main 方法是静态方法三、静态常量四、总结先看看下面这一串代码: public...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作