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

目录

一、类的两个概念:

1、类自身;

2、类的实例对象;

二、对象的两个部分

1、属性 

2、方法

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

1、为什么使用静态方法

三、总结

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

2.使用static的注意事项


一、类的两个概念:

1、类自身;

2、类的实例对象;

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

二、对象的两个部分

1、属性 

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

2、方法

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

class Person {
  //1、定义方法
  /* 1.1、实例属性,直接定义的属性,要new实例后,实例去访问的*/
  name= "tom";
  age = 10;
  /* 1.2、静态属性(类属性),通过static开头的属性,Person类可以访问,
    不需要创建实例,实例访问不到 */
  static height = 180;
  /* 1.3、只读属性,readonly开头的属性,只可读,不可改*/
  readonly money= 1000;

  //2、定义方法

  say(){
      console.log('hello world');    
  }
  static work(){
      console.log('我能挣钱');    
  }
}
const per = new Person();
//per.money=2000  报错,不可修改
console.log(per, Person.height);
per.say()  //调用实例方法
Person.work() //调用类方法

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

1、为什么使用静态方法

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

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

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

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

class User{
            static call(){
               console.log('你好呀');
            }
        }
  
  
     class foo extends User{}
     foo.call()//'你好呀'    

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

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

 
 class User{
            static call(){
               console.log('静态方法的你好呀');
            }
            call(){
               console.log('构造函数方法的你好呀');
            }
        }
 
//等同于
function User(){}
     User.call=function(){
         console.log('静态方法的你好呀');
     }
   
    User.prototype.call=function(){
         console.log('构造函数方法的你好呀');
     }

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

function User(){}
User.prototype.call=function(){
         console.log('你好呀');
     }
     let h1 =new User()
     h1.call()//你好呀

完整版如下

class User {
            call() {
                // 这里面的this指向构造函数的对象
                console.log(this === hh); // true
                console.log("构造函数方法的你好呀");
            }
            static call() {
                // 这里面的this指向类本身
                console.log(this === User); // true
                console.log("静态方法的你好呀");
            }
        }
        // 静态方法
        User.call(); //静态方法的你好呀
 
        // 构造函数方法
        let hh = new User();
        hh.call(); //构造函数方法的你好呀

三、总结

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

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

2.使用static的注意事项

  • 带静态修饰符的方法只能访问静态属性
  • 非静态方法既能访问静态属性也能访问非静态属性
  • 非静态方法不能定义静态变量
  • 静态方法不能使用this关键字
  • 静态方法不能调用非静态方法,反之可以
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
JavaScript,使用class语法定义时,可以通过在构造函数直接定义属性来定义成员属性,也可以使用静态属性来定义成员属性。 成员属性是每个实例对象独有的属性,可以通过在构造函数使用this关键字来定义。例如,以下代码定义了一个Person,其的name和age属性是成员属性: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } } var person1 = new Person("John", 30); console.log(person1.name); // 输出:John console.log(person1.age); // 输出:30 ``` 成员属性是所有实例对象共享的属性,可以使用静态属性来定义。例如,以下代码定义了一个Animal,其的count属性成员属性: ``` class Animal { static count = 0; constructor(name) { this.name = name; Animal.count++; } } var animal1 = new Animal("cat"); var animal2 = new Animal("dog"); console.log(Animal.count); // 输出:2 ``` 在上面的代码,count属性被定义为Animal静态属性,它可以在的任何方法访问,而且所有Animal的实例共享该属性。在构造函数,每次创建Animal对象时,都会将count属性加1,从而实现对象计数的功能。 需要注意的是,成员属性成员属性是有区别的,它们的作用域和生命周期不同。成员属性是每个实例独有的,而成员属性是所有实例共享的。在使用时需要根据需要进行选择。同时,在class语法成员属性必须使用static关键字进行定义,成员属性则不需要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕穗子博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值