ES6 class类

雨点打透心脏的1/2处 2023-02-21 04:46 44阅读 0赞

1、类class

类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式和类声明。

函数声明类声明之间的一个重要区别是函数声明会提升,类声明不会。

2、类中定义的方法在实例的原型上

类中定义的方法,在原型prototype上,类中constructor构造函数定义的方法和属性 是实例对象的

  1. class Foo {
  2. constructor(){
  3. this.a = 1;
  4. this.b = 2;
  5. }
  6. func1(){
  7. console.log("func1");
  8. }
  9. func2(){
  10. console.log("func2");
  11. }
  12. }
  13. console.log(Foo.prototype);
  14. console.log(new Foo())

20200628162624112.png

可以通过Object.assign方法给原型添加方法或属性

  1. class Foo {
  2. constructor(){
  3. this.a = 1;
  4. this.b = 2;
  5. }
  6. func1(){
  7. console.log("func1");
  8. }
  9. func2(){
  10. console.log("func2");
  11. }
  12. }
  13. Object.assign(Foo.prototype,{
  14. c: 3,
  15. func3: function(){
  16. console.log("func3");
  17. }
  18. })

原型上的constructor属性指向类本身,即Foo.prototype.constructor === Foo

类内部的所有方法都是不可枚举的,但是后续在原型上添加的方法属性是可枚举的。

3、类中的constructor

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加

类中的constructor函数是构造函数,当 new Foo的时候,实际上执行的是new constructor,所以,constructor内的写法和构造函数是一样的,如果constructor返回一个对象 ,那么通过class类创建的实例,就是得到这个对象。而该实例不继承类中的方法和属性 。

  1. class Foo {
  2. constructor(){
  3. this.a = 1;
  4. this.b = 2;
  5. return {m:5}
  6. }
  7. func1(){
  8. console.log("func1");
  9. }
  10. func2(){
  11. console.log("func2");
  12. }
  13. }
  14. var foo = new Foo();
  15. console.log(foo) 结果: {m: 5}

类必须使用new调用,否则会报错。函数作为构造函数,进行new创建对象,此时的函数还可以不用new 作为函数使用。但是class类,不能作为函数使用,new class就是来创建对象实例的。

实例的属性也可以不用写在constructor中,写在类内部中前面,这样实例的方法比较一目了然。

  1. class Foo {
  2. a = 1;
  3. b = 2;
  4. func1(){
  5. console.log("func1");
  6. }
  7. }
  8. var foo = new Foo();
  9. console.log(foo); Foo {a: 1, b: 2}

4、getter和setter

类中也可以通过getter和setter方法来定义原型上的属性,而且我们知道ES5中,getter和setter在原型上定义的属性是可以被实例修改的(数据属性不可以)。ES6类中,同样有这个效果。

  1. class Foo {
  2. constructor(){
  3. this.a = 1;
  4. this.b = 2;
  5. }
  6. func1(){
  7. console.log("func1");
  8. }
  9. func2(){
  10. console.log("func2");
  11. }
  12. get prop(){
  13. return this.b
  14. }
  15. set prop(value){
  16. this.b = value;
  17. }
  18. }
  19. var foo = new Foo();
  20. foo.prop = 10;//实例可以通过get set设置原型上的属性
  21. console.log(foo)
  22. console.log(Object.getOwnPropertyNames(foo));

结果:
20200701111450349.png

分析:(1)创建的实例foo,可以设置或者获取原型的prop属性。且该属性是通过实例foo的b属性值来的。我们知道get 和set肯定需要一个媒介。

5、类可以供类内部使用

下面是类变量申明和具名表达式,都可以使用类。但是类的匿名表达式,由于没有类名,内部使用不了类。

  1. //类变量声明
  2. class Foo {
  3. constructor(){
  4. this.a = 1;
  5. this.b = 2;
  6. console.log(Foo);
  7. }
  8. func1(){
  9. console.log("func1");
  10. }
  11. }
  12. //具名声明类
  13. let classBar = class Bar{
  14. constructor(){
  15. console.log(Bar);
  16. }
  17. }
  18. new Foo();
  19. new classBar();

类的方法内部如果含有this,它默认指向类的实例。

6、类中的静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

如下:实例foo的原型上没有func2方法。func2是类的静态方法,不在原型上,不被继承。静态方法供类,所以this指向类本身。

  1. class Foo {
  2. constructor(){
  3. this.a = 1;
  4. this.b = 2;
  5. Foo.func2();
  6. }
  7. func1(){
  8. console.log("func1");
  9. }
  10. static func2(){
  11. console.log(this);//this指向Foo,静态方法供类在内部使用
  12. }
  13. }
  14. var foo = new Foo();
  15. console.log(foo);

2020070113252191.png

7、类的静态属性

类的静态属性同样不在原型上。

写法上,要在类的外部定义:
prop1个prop2是Foo的静态属性,不在实例上,也不会在原型上。

  1. class Foo {
  2. constructor(){
  3. this.a = Foo.prop1;
  4. this.b = Foo.prop2;
  5. }
  6. func1(){
  7. console.log("func1");
  8. }
  9. }
  10. Foo.prop1 = 11; 静态属性
  11. Foo.prop2 = 22; 静态属性
  12. var foo = new Foo();
  13. console.log(foo);

8、私有属性和私有方法

有个提案在变量名前加#,表明该属性或方法是类内部的,只能在类内部使用,不能在类外使用,否则会报错。

发表评论

表情:
评论列表 (有 0 条评论,44人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6中新增class

    我们都知道JavaScript是弱类型的语言,其缺陷就是缺乏严谨性,但是在JavaScript发展的过程中需要慢慢的弥补这些缺陷,于是便在ES6中出现了类的概念。 文

    相关 ES6 class

    ES6中的类 js中生成实例对象的传统方法是通过构造函数。而ES6提供了更接近传统语言的写法,引入了class类这个概念,作为对象的模板,通过class类关键字,可以定义

    相关 ES6 class的继承

    类的继承:`extends`关键字用于[类声明][Link 1]或者[类表达式][Link 2]中,以创建一个类,该类是另一个类的子类。 `extends`关键字用来创建一个

    相关 ES6--Class

    Class概述 概述 在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。 class 的本质是 function。 它可以