您好,欢迎访问一九零五行业门户网

ES6中class关键字详解

class是es6引入的最重要特性之一。在没有class之前,我们只能通过原型链来模拟类。本文主要介绍了es6中class关键字,class是es6引入的最重要特性之一。本文通过实例代码给大家详解,需要的朋友可以参考下,希望能帮助到大家。
1 、介绍
//定义类   class point {    constructor(x, y) {    this.x = x;    this.y = y;    }    tostring() {    return '(' + this.x + ', ' + this.y + ')';    }   }
point类除了构造方法,还定义了一个tostring方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。  
 //类的数据类型就是函数,类本身就指向构造函数。用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。   class bar {    dostuff() {    console.log('stuff');    }   }   var b = new bar();   b.dostuff() // stuff
2、严格模式
类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用
3、constructor 方法
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。    
class point {   }   // 等同于   class point {    constructor() {}//constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。   }   //注意:类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
4、类的实例对象
生成类的实例对象的写法,使用new命令。
实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。    
 class point {    // ...   }   // 报错   var point = point(2, 3);   // 正确   var point = new point(2, 3);
5、class 表达式
下面代码使用表达式定义了一个类。需要注意的是,这个类的名字是myclass而不是me,me只在 class 的内部代码可用,指代当前类。      
 const myclass = class me {    getclassname() {    return me.name;    }   };   //采用 class 表达式,可以写出立即执行的 class。   var person = new class {    constructor(name) {    this.name = name;    }    sayname() {    console.log(this.name);    }   }('张三');   person.sayname(); // 张三
6、不存在变量提升
类不存在变量提升(hoist)
下面代码中,foo类使用在前,定义在后,这样会报错,因为 es6 不会把类的声明提升到代码头部。这种规定的原因与下文要提到的继承有关,必须保证子类在父类之后定义。
  new foo(); // referenceerror   class foo {}
7、私有方法
私有方法是常见需求,但 es6 不提供,只能通过变通方法模拟实现。
添加私有方法办法
①在命名上加以区别。
②利用symbol值的唯一性,将私有方法的名字命名为一个symbol值。      
 /*命名上加以区别*/   class widget {    // 公有方法    foo (baz) {    this._bar(baz);    }    // 私有方法    _bar(baz) {    return this.snaf = baz;    }    // ...   }   /*利用symbol*/   const bar = symbol('bar');   const snaf = symbol('snaf');      export default class myclass{    // 公有方法    foo(baz) {    this[bar](baz);    }    // 私有方法    [bar](baz) {    return this[snaf] = baz;    }    // ...   };
8、私有属性
与私有方法一样,es6 不支持私有属性。目前,有一个提案,为class加了私有属性。方法是在属性名之前,使用#表示。   
 class point {    #x;    constructor(x = 0) {    #x = +x; // 写成 this.#x 亦可    }    get x() { return #x }    set x(value) { #x = +value }   }
9、this 的指向
类的方法内部如果含有this,它默认指向类的实例。
一旦单独使用该方法,很可能报错。     
 class logger {    printname(name = 'there') {    this.print(`hello ${name}`);    }       print(text) {    console.log(text);    }   }    const logger = new logger();   const { printname } = logger;   printname();   //上面代码中,printname方法中的this,默认指向logger类的实例。但是,如果将这个方法提取出来单独使用,this会指向该方法运行时所在的环境,因为找不到print方法而导致报错。   /*解决方法是,在构造方法中绑定this,这样就不会找不到print方法了。*/   class logger {    constructor() {    this.printname = this.printname.bind(this);    }      // ...   }
10、name 属性
由于本质上,es6 的类只是 es5 的构造函数的一层包装,所以函数的许多特性都被class继承,包括name属性。
name属性总是返回紧跟在class关键字后面的类名。    
 class point {}   point.name // point
相关推荐:
es6 class 中的 super 关键字详解
es6 javascript中class类的get与set用法实例
在js中class属性需要如何使用
以上就是es6中class关键字详解的详细内容。
其它类似信息

推荐信息