• 【ES6】-- js类与类的继承


    ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

    我们可以通过class关键字来定义一个类:

    1. class Person{
    2. constructor(name,age){
    3. this.name=name;
    4. this.age=age
    5. }
    6. sayName(){ //--类似于存在类的原型对象中
    7. console.log(this.name)
    8. }
    9. }
    10. static personAttr = '静态属性';
    11. static personMethod(){
    12. console.log('这是静态方法');
    13. }

    注意:

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

    实例: 

    使用new创建Person的实例对象p1与p2:

    1. let p1 = new Person('zzy', 17, 'female');
    2. console.log(p1); // Person { name: 'zzy', age: 17, gender: 'female' }
    3. p1.sayName(); // zzy
    4. let p2 = new Person();
    5. console.log(p1.sayName===p2.sayName); // true
    6. // 说明由Person创建出来的实例对象都可以使用这个公共方法
    7. // 静态属性和静态方法只能由类本身去调用
    8. Person.personMethod(); // 这是静态方法
    9. console.log(Person.personAttr); // 静态属性
    10. p1.personMethod(); // 会报错,不能由实例对象调用

    注意:

    1. 这里定义的sayName方法是一个公共方法,类似于存在于原型对象Person.prototype中,由Person创建的实例对象都可以使用这个方法。
    2. 用static定义的属性和方法是静态属性与方法,实例对象不可调用,只能由类本身去直接调用。

    *** 

    • 引用数据类型对应的是实例的私有属性
    •  基本数据类型对应的是实例的公共属性

    添加一个引用数据类型的属性: 

    1. // 添加引用数据类型的属性
    2. test = [];
    3. ...
    4. // 在p1里添加一个元素
    5. p1.test.push('cute')
    6. console.log(p1);

     此时再打印p1与p2可以看到:

    这个元素在p1中被添加进去了,p2没有。,说明引用数据类型对应的是实例的私有属性。

     添加一个基本数据类型的属性: 

    1. // 基本数据类型对应的是实例的公共属性
    2. test1 = 'hello';
    3. ...
    4. console.log(p1.test1===p2.test1,'公共属性'); // true 公共属性

    可以看到p1与p2中的test1是完全相等的 。

    类的继承

    class可以通过extends关键字实现继承,子类可以没有构造函数,系统会默认分配。子类提供了构造函数则必须要显式调用super。super函数类似于借用构造函数。类似于.call()

    父类Animal: 

    1. class Animal{
    2. constructor(name, age, gender){
    3. // 实例的私有属性
    4. this.name = name;
    5. this.age = age;
    6. this.gender = gender;
    7. console.log('父类构造器');
    8. }
    9. sayName(){
    10. console.log(this.name);
    11. }
    12. static animaiAttr = '父类静态属性';
    13. static animalMethod(d1){
    14. return d1 instanceof Animal;
    15. }
    16. }

     子类实现继承:

    1. class Dog extends Animal{
    2. constructor(name, age, gender, type){
    3. // console.log('子类构造器'); 放在这里就先打印子类构造器
    4. super(name, age, gender);
    5. // console.log('子类构造器'); 放在这里就先打印父类构造器
    6. this.gender = gender;
    7. }
    8. };

    注意: ES6 要求,子类的构造函数必须执行一次super函数。代表父类的构造函数。因此,当我们的的打印位置出现在super的先后次序不一样时会出现不一样的执行结果。作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。

    基本继承格式:

    1. class 子类 extends 父类{
    2. //继承父类实例私有属性
    3. constructor(){
    4. super()
    5. //继承父类构造器
    6. }
    7. }
    • 子类对象通过__proto__指针指向父类对象
    console.log(Dog.__proto__===Animal); // true
    • 子类原型对象继承父类原型对象
    console.log(Dog.prototype.__proto__===Animal.prototype); // true

  • 相关阅读:
    Nginx动静分离
    Python做一个中秋节嫦娥投食小游戏
    Java笔试复盘
    园子周边:Polo 衫效果图预览
    [附源码]计算机毕业设计springboot家庭医生签约服务管理系统
    freeRTOS学习(三)
    windows10通过L2TP VPN隧道连接到企业内网
    Compose原理-视图和数据双向绑定的原理
    MyBatis--获取参数值
    libstdc++.so.6 版本过低导致的编译失败
  • 原文地址:https://blog.csdn.net/qq_48802092/article/details/126892547