ES6——类的创建、添加以及继承

简介: 类的创建、添加以及继承

一、创建类和对象

例子如下:

class Star {    //    1、首字母大写,类名不要加()
            constructor(name,age){    //无需加function
                this.name = name;
                this.age = age
            }
        }
        // 2、利用类创建对象 new
        var a = new Star('Nan',10);    //生成的实例对象加()
        var b = new Star('Chen',20);
        console.log(a);
        console.log(b);

打印效果:

20211010104944535.png

注意:

1、通过class创建类,类名最好首字母大写

2、constructor(){},用来接收传递的参数,并且返回实例对象

3、constructor(){} 一旦生成new实例对象时,就会自动调用这个函数,如果不写这个函数,其类也会生成这个函数

4、生成实例 new 不能省略

5、语法规范:创建类后的类名不要加小括号 ,生成实例对象的类名需要加(),构造函数无需加function

二、类中添加其方法

直接看代码:

// 1、创建类class
        class Star {
    // 类的共有属性放到 constructor 里面
            constructor(name,age){
                this.name = name;
                this.age = age
            }
            listen(music){
                console.log('姓名:'+this.name+'年龄:'+this.age+'爱听的音乐:'+ music);
            }
        }
        // 2、利用类创建对象 new
        var a = new Star('Nan',10);
        var b = new Star('Chen',20);
        a.listen('One Day');
        b.listen('Whistle');
        console.log(a);
        console.log(b);

打印效果:

20211010105558543.png

三、类的继承

比如这里创建一个父类,用子类继承其父类的属性

看例子:

class Father{
            constructor(a,b) {
                this.a = a;
                this.b = b;
            }
            sum(){
                console.log(this.a +this.b);
            }
        }
        // 继承父类
        class Son extends Father{
            constructor(x,y) {
                this.x = x;
                this.y = y;
            }
        }
        var son = new Son(10,12);
        son.sum();

20211010105928391.png

这里会报错,这里没有办法继承,就需用到一个新的方法super

super()方法

语法:super([arguments]); // 调用 父对象/父类 的构造函数

super关键字用于访问和调用一个对象的父对象上的函数

在构造函数中使用时,super关键字将单独出现,并且必须在使用this关键字之前。super关键字也可以用来调用父对象上的函数。

正确继承写法如下:

class Father{
            constructor(a,b) {
                this.a = a;
                this.b = b;
            }
            sum(){
                console.log(this.a +this.b);
            }
        }
        // 继承父类
        class Son extends Father{
            constructor(x,y) {
                super(x,y); // 调用父类中的构造函数
                /* this.x = x;
                this.y = y; */
            }
        }
        var son1 = new Son(10,12);
        var son2 = new Son(100,120);
        son1.sum();
        son2.sum();

打印结果:

20211010110349914.png

四、子类继承父类的方法同时扩展自己的方法

特别注意:super必须写在this的前面!

class Father{
            constructor(a,b) {
                this.a = a;
                this.b = b;
            }
            fn(){
                console.log(this.a + this.b);
            }
        }
        // 子类继承父类
        class Son extends Father{
            constructor(a,b) {
                // super必须写在this前面
                super(a,b);
                this.a = a;
                this.b = b;
            }
            fn2(){
                console.log(this.b - this.a);
            }
        }
        var son = new Son(5,8);
        son.fn();
        son.fn2();
        // 可以用父亲的,也可以用自己的

五、super关键字调用父类的普通函数

如果父类和子类都有一个相同的函数,那么会优先调用谁的呢?答:就近原则

看下面这个例子:

class Father{
            fn1(){
                console.log("I'm daddy");
            }
        }
class Son extends Father{
            fn1(){
                console.log("I'm a son")
            }
        }    
var son = new Son();
son.fn1();    //I'm a son

这里我创建了一个Father类和一个Son类,但是都有一个相同的函数fn1(),返回的只有Son函数

打印效果如下:

20211010112722446.png

如果父类和子类都有一个函数,调用的话是按照就近原则(先调用儿子如果找不到儿子的这个方法再往上面找

如果想要继承父亲的话就要在Son中添加super

class Father{
            fn1(){
                return "I'm daddy";    //这里要替换成return,不然会显示undefined
            }
        }
        class Son extends Father{
            fn1(){
                // console.log("I'm a son")
                console.log(super.fn1() + '的son')
            }
        }
        var son = new Son();
        son.fn1();// I'm daddy的son

打印效果如下:

20211010113201317.png

六、使用类的注意事项

看下面这个例子:

//html部分
<button>点击</button>
//script部分 
class Star {
            constructor(name,age) {
                //console.log(this);//这里的this指向的是Star这个类
                this.name = name;
                this.age = age;
                this.btn = document.querySelector('button');
                this.btn.onclick =this.look;
            }
            look(){
                // console.log(this);// 这个look方法里面的this 指向的是 btn 这个按钮,因为这个按钮调用了这个函数
                console.log(this.name);    //这里获取不了name的值
            }
        }
        var a = new Star('Nanchen',89);

打印效果如下:

20211010113801374.png

解决办法:定义一个初始化变量,使得this赋值给这个定义的变量,然后用这个变量替换其中的this即可

var that = null;    //进行初始化
        class Star {
            constructor(name,age) {
                console.log(this);
                // 让把this赋值给that
                that = this;
                this.name = name;
                this.age = age;
                this.btn = document.querySelector('button');
                this.btn.onclick =this.look;
            }
            look(){
                console.log(this);
                console.log(that.name);    //this替换成that
            }
        }
        var a = new Star('Nanchen',89);

打印效果:

20211010114209171.png

对比上段代码:

20211010114316273.png

还需注意一点:

这里新建一个tour方法,这里的tour方法中的this指向的是整个Star的内容

// 定义一个空值
        var that = null;
        var _that = null;
        class Star {
            constructor(name,age) {
                console.log(this);
                // 让把this赋值给that
                that = this;
                this.name = name;
                this.age = age;
                this.btn = document.querySelector('button');
                this.btn.onclick =this.look;
            }
            look(){
                // 这个look方法里面的this 指向的是 btn 这个按钮,因为这个按钮调用了这个函数
                console.log(this);
                console.log(that.name);
            }
            tour(){
                _that = this;
                console.log(this);
            }
        }
        var a = new Star('Nanchen',89);
        a.tour();
        console.log(_that === a);   // true
        console.log(that === a);    // ture

打印效果如下:

20211010114738615.png

使用类的注意事项总结:

1. 在 ES6 中的类没有变量提升,必须先定义类,才能通过类实例化对象。

2. 类里面的共有的属性和方法一定要加this使用。

3.constructor 里面的this 指向的是创建的实例对象,方法里面的this 指向的是这个方法的调用者。

相关文章
|
1月前
|
JavaScript 前端开发
es6 类与继承
ES6 的类与继承特性使得 JavaScript 的面向对象编程更加规范和易于维护,提高了代码的可读性和可复用性,广泛应用于各种复杂的 JavaScript 应用程序开发中。
类与ES6类之间的继承
类与ES6类之间的继承
|
3月前
es5 类与继承
es5 类与继承
22 0
|
7月前
|
JavaScript 前端开发
ES6如何声明一个类?类如何继承?
ES6如何声明一个类?类如何继承?
46 0
ES5的继承和ES6的继承有什么区别
ES5的继承和ES6的继承有什么区别
77 0
|
JavaScript
【ES6】类
【ES6】类
61 0
|
前端开发 JavaScript
ES6——class类实现继承
ES6——class类实现继承
141 0
|
Python
5 类的创建及使用
5 类的创建及使用
128 0