一、创建类与对象

1.创建属性

class Star { // 创建类
            constructor(uname, age) {
                this.uname = uname;
                this.age = age;
            }
        }
        var ldh = new Star('刘德华', 99); // 创建对象
        // 结果:Star {uname: '刘德华', age: 99}

看法:可以将类看成加工对象的加工厂,类就是为了方便生成对象而存在,传递入什么参数类会帮你创建一个你想要的对象。

注:(1).类名习惯大写

(2).constructor会接收传递来的参数,返回实例对象,并且一个类只能包含一个constructor

(3).生成对象时,new不能省略

2.创建方法

class Star { // 创建类
            constructor(uname, age) {
                this.uname = uname;
                this.age = age;
            }
            sing(song) {
                console.log(song);
            }
        }
        var ldh = new Star('刘德华', 99); // 创建对象
        console.log(ldh); // 结果:Star {uname: '刘德华', age: 99}
        ldh.sing('歌'); // 结果:输出歌

注:1.类里面的函数之间不加逗号

3.创建有关dom元素(按钮)的类

class Star {
            constructor(uname, age) {
                this.uname = uname;
                this.age = age;
                this.btn = document.querySelector('button');
                this.btn.onclick = this.sing; // 创建时先不调用 不加括号
            }
            sing() {
                console.log('hi');
            }
        }
        var ldh = new Star('Ldh');
        // 实现:点击按钮就会输出hi

二、类的继承

1.继承方法

class Father { // 创建父类
            constructor() {

            }
            say() {
                console.log('hello');
            }
        }
        class Son extends Father { // 子类继承父类

        }
        var son = new Son(); // 由子类创建对象
        son.say(); // 结果:输出hello

2.访问父类方法与函数(传递参数调用问题)

class Father { // 创建父类
            constructor(x, y) {
                this.x = x; // 接收子类传来的1,2进行运算
                this.y = y;
            }
            sum() {
                console.log(this.x + this.y);
            }
        }
        class Son extends Father { // 子类继承父类
            constructor(x, y) {
                super(x, y); // son调用了父类的构造函数,将1,2传到父类
            }
        }
        var son = new Son(1, 2); // 1,2作为实参传入son中
        son.sum();

3.子类继承父类函数(同名函数调用问题)

就近原则,子类有就用子类的,子类没有再找父类

class Father {
            say1() {
                console.log('father1');
            }
            say() {
                console.log('father');
            }
        }
        class Son extends Father { // 子类继承父类
            say() {
                console.log('son');
            }
        }
        var son = new Son(); // 子类创建对象
        son.say(); //say函数子类存在,就输出子类中的内容
        // 结果:son
        son.say1(); //say1函数子类中不存在,就返回最近的父类中的内容
        // 结果:father1

4.子类调用父类函数

class Father {
            say() {
                return 'father';
            }
        }
        class Son extends Father { // 子类继承父类
            say() {
                console.log(super.say() + '\'s son'); // 输出引号前加\
                //super调用父类的方法
            }
        }
        var son = new Son(); // 子类创建对象
        son.say(); // 结果:father' son

5.子类继承并增添父类函数

class Father {
            constructor(x, y) {
                this.x = x;
                this.y = y;
            }
            getSum() {
                console.log(this.x + this.y);
            }
        }
        class Son extends Father {
            constructor(x, y) {
                super(x, y); // 向上传递参数,而且super必须在this之前
                this.x = x;
                this.y = y;
            }
            getSub() {
                console.log(this.x - this.y);
            }

        }
        var son = new Son(9, 3);
        son.getSum(); // 结果:12
        son.getSub(); // 结果:6

三、类和对象的注意事项

1.类没有变量提升,所以在用类来创建对象时,必须先定义类,否则会报错。

2.类里面的属性要加this

3.this的指向问题

在constructor中,里面的this指向的是新创建的对象。

在函数中看是谁调用了这个函数就指向谁。

例子:

class Star {
            constructor(uname, age) {
                console.log(this); // this指向新创建的对象
                this.uname = uname;
                this.age = age;
                this.btn = document.querySelector('button');
                this.btn.onclick = this.sing; // 创建时先不调用 不加括号
            }
            sing() { // btn调用了sing,this指向btn
                console.log(this);
                console.log('hi');
            }
            dance() { // ldh调用了dance,this指向新创建的对象
                console.log(this);
            }
        }
        var ldh = new Star('Ldh');
        // 实现:点击按钮就会返回btn并且输出hi

如果想在sing里调用uname,可以在类外面先定义一个全局变量that,在constructor中把this赋值给that来通过that传递新创建的对象,再调用新创建的对象里面的uname。