• JS中Class类的静态属性和静态方法


    目录

    一、类的两个概念:

    1、类自身;

    2、类的实例对象;

    二、对象的两个部分

    1、属性 

    2、方法

    三、静态方法使用:在方法前加上static关键字。

    1、为什么使用静态方法

    三、总结

    1、静态属性和非静态属性的区别:

    2.使用static的注意事项


    一、类的两个概念:

    1、类自身;

    2、类的实例对象;

    总的来说:静态的是指向类自身,而不是指向实例对象,主要是归属不同,这是静态属性,静态方法的核心。

    二、对象的两个部分

    1、属性 

    分为:实例属性、静态属性(类属性)、只读属性

    2、方法

    分为:实例方法、静态方法(类方法)

    1. class Person {
    2. //1、定义方法
    3. /* 1.1、实例属性,直接定义的属性,要new实例后,实例去访问的*/
    4. name= "tom";
    5. age = 10;
    6. /* 1.2、静态属性(类属性),通过static开头的属性,Person类可以访问,
    7. 不需要创建实例,实例访问不到 */
    8. static height = 180;
    9. /* 1.3、只读属性,readonly开头的属性,只可读,不可改*/
    10. readonly money= 1000;
    11. //2、定义方法
    12. say(){
    13. console.log('hello world');
    14. }
    15. static work(){
    16. console.log('我能挣钱');
    17. }
    18. }
    19. const per = new Person();
    20. //per.money=2000 报错,不可修改
    21. console.log(per, Person.height);
    22. per.say() //调用实例方法
    23. Person.work() //调用类方法

    三、静态方法使用:在方法前加上static关键字。

    1、为什么使用静态方法

    阻止方法被实例继承类的内部相当于实例的原型,所有在类中直接定义的方法相当于在原型上定义方法,都会被类的实例继承,但是使用static静态方法定义的不会被实例继承。

    1. class User{
    2. static call(){
    3. console.log('你好呀');
    4. }
    5. }
    6. User.call()//你好呀
    7. let ff = new User()
    8. ff.call()//报错,实例不能访问类的静态方法

    这里类User可以直接使用call方法,但它的是实例ff却不可以!

    但是我们可以通过继承的方式,让另一个类来继承User里面的方法

    1. class User{
    2. static call(){
    3. console.log('你好呀');
    4. }
    5. }
    6. class foo extends User{}
    7. foo.call()//'你好呀'

    这里foo类通过继承User类,才可以使用User里面的静态方法。

    我们知道class类这个概念是es6后出来的新特性,用以前的es5方法写就是:

    1. class User{
    2. static call(){
    3. console.log('静态方法的你好呀');
    4. }
    5. call(){
    6. console.log('构造函数方法的你好呀');
    7. }
    8. }
    9. //等同于
    10. function User(){}
    11. User.call=function(){
    12. console.log('静态方法的你好呀');
    13. }
    14. User.prototype.call=function(){
    15. console.log('构造函数方法的你好呀');
    16. }

    但是User类里面的构造函数方法是可以被实例调用的,如图:

    1. function User(){}
    2. User.prototype.call=function(){
    3. console.log('你好呀');
    4. }
    5. let h1 =new User()
    6. h1.call()//你好呀

    完整版如下

    1. class User {
    2. call() {
    3. // 这里面的this指向构造函数的对象
    4. console.log(this === hh); // true
    5. console.log("构造函数方法的你好呀");
    6. }
    7. static call() {
    8. // 这里面的this指向类本身
    9. console.log(this === User); // true
    10. console.log("静态方法的你好呀");
    11. }
    12. }
    13. // 静态方法
    14. User.call(); //静态方法的你好呀
    15. // 构造函数方法
    16. let hh = new User();
    17. hh.call(); //构造函数方法的你好呀

    三、总结

    1、静态属性和非静态属性的区别:

    • 在内存中存放的位置不同:所有static修饰的属性和方法都存放在内存的方法区里,而非静态的都存在堆内存中
    • 出现的时机不同:静态属性和方法在没创建对象之前就存在,而非静态的需要在创建对象才存在
    • 静态属性是整个类都公用的
    • 生命周期不一样,静态在类消失后被销毁,非静态在对象销毁后销毁
    • 用法:静态的可以直接通过类名访问,非静态只能通过对象进行访问

    2.使用static的注意事项

    • 带静态修饰符的方法只能访问静态属性
    • 非静态方法既能访问静态属性也能访问非静态属性
    • 非静态方法不能定义静态变量
    • 静态方法不能使用this关键字
    • 静态方法不能调用非静态方法,反之可以
  • 相关阅读:
    (JAVA)P5708 【深基2.习2】三角形面积
    (附源码)ssm产品裂变管理系统 毕业设计 100953
    哈希表的概念
    Windows 下使用 nmap ncat 命令测试 UDP 端口连接
    VSCode 开发 Vue 语法提示
    Dockerfile文件解释
    win11自带矩形块截屏、录屏、视频编辑等功能
    本地服务访问图片列表,图片403问题解决
    SpringBoot访问静态资源
    视频号迎来重大更新,这些功能久等了
  • 原文地址:https://blog.csdn.net/m0_64346035/article/details/125801373