ES6 类 class

栏目: JavaScript · 发布时间: 7年前

内容简介:ES6 类 class
  • 使用 class 关键字定义一个类
classCircle{
    constructor(r) {
        this.r = r;
    }

    getArea() {
        return Math.PI * (this.r ** 2);
    }
}

console.log(typeof Circle); // function

// 新建一个实例
let c1 = new Circle(3);
c1.getArea(); // 28.274333882308138

console.log(Object.prototype.toString.call(c1)); // [object Object]
  • 类名指向构造函数
    • constructor 方法是类的构造函数,如果没显式定义,则一个空的 constructor 方法会被默认添加。
Circle === Circle.prototype.constructor;         // true
Circle === c1.constructor;                       // true
  • class 不存在变量提升(hoist)
let a = new Circle(); // 报错,Uncaught ReferenceError: Circle is not defined

classCircle{
    // ...
}
  • 与函数一样,class 也有 class 表达式
const MyClass = class{ 
    /* ... */ 
};
  • 事实上,类的所有方法都定义在类的prototype属性上面
Circle.prototype.getArea === c1.getArea; // true
  • 类的内部所有定义的方法,都是不可枚举的(non-enumerable)
Object.keys(Circle.prototype);                // []
Object.getOwnPropertyNames(Circle.prototype); // ["constructor", "getArea"]
  • class 内部属性的取值函数(getter)和存值函数(setter)
classPerson{
    constructor(name) {
        this.name = name;
    }

    get name() {
        return 'this.name';
    }

    set name(name) {
        name = '改不了';
        console.log(name);
    }
}

let p = new Person('Celeste');

p.name; // this.name
p.name = 'hehe'; // 打印 '改不了'
p.name; // this.name

class 的属性

以下 class 属性的语法还处于提案中,浏览器尚不支持

  • 类的实例属性
classA{
    instanceProp = 123;
}

let a = new A();
console.log(a.instanceProp);
  • 类的静态属性: 用 static 关键字声明
classA{
    static staticProp = 123;
}

console.log(A.staticProp);

let a = new A();
console.log(a.staticProp); // 报错或 undefined
  • 类的私有属性: 在属性名之前,添加 # 符号,表示私有变量
class A {
    #privateProp = 123;

    constructor() {
        this.prop = #privateProp;
    }
}

let a = new A();
console.log(a.prop);

ES6 明确规定,class 内部只有静态方法,没有静态属性。以后的语法会不会支持静态属性,静待啦!

class 的静态方法

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

  • 类的静态方法不会被实例继承
classA{
    static hello() {
        console.log('hello world');
    }
}

A.hello(); // 打印 hello world

let a = new A();
a.hello(); // 报错,Uncaught TypeError: a.hello is not a function
  • 父类的静态方法,可以被子类继承
    • 父类的静态方法也可以从 super 对象上在子类静态方法中调用
classA{
    static hello() {
        console.log('hello world');
    }
}

classBextendsA{
    static greet() {
        super.hello(); // 利用 super 调用父类的静态方法
    }
}

A.hello(); // 打印 hello world
B.hello(); // 打印 hello world

B.greet(); // 打印 hello world

类的继承

ES6 中,class 之间可以通过 extends 关键字实现继承。

  • super 关键字可用于调用父类的构造函数,也可用于调用父类的方法

  • 子类必须在构造函数中调用一次 super 方法,否则新建实例时会报错(Uncaught ReferenceError: this is not defined)。这是因为子类没有自己的 this 对象,而是继承父类的 this 对象,然后对其进行加工。如果不调用 super 方法,子类就得不到 this 对象。

classAnimal{
    constructor(kind) {
        this.kind = kind;
    }
    running() {
        console.log('I can run~');
    }

    eatting() {
        console.log('I can eat~');
    }
}

classDogextendsAnimal{
    constructor(name) {
        super('Dog'); // 调用父类的构造函数
        this.name = name;
    }

    speaking() {
        console.log('汪汪汪~');
        super.running(); // 调用父类的方法
    }
}

let dog = new Dog('小八');
dog.speaking();

// 汪汪汪~
// I can run~
  • 子类的实例也是父类的实例
dog instanceof Dog;    // true
dog instanceof Animal; // true
dog instanceof Object; // true
  • 子类与父类的 prototype 属性和 __proto__ 属性的关系
classA{}
classBextendsA{}

B.__proto__ === A.prototype;            // false
B.__proto__ === A;                      // true
B.prototype.__proto__ === A.prototype;  // true

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Analytics 2.0

Web Analytics 2.0

Avinash Kaushik / Sybex / 2009-10-26 / USD 39.99

The bestselling book Web Analytics: An Hour A Day was the first book in the analytics space to move beyond clickstream analysis. Web Analytics 2.0 will significantly evolve the approaches from the fir......一起来看看 《Web Analytics 2.0》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具