[JS]面向对象ES6

class类

ES6是基于 class关键字 创建类

复制代码
<script>
    // 1.定义类
    class Person {
      // 公有属性
      name
      // 公有属性 (设置默认值)
      age = 18
      // 构造函数
      constructor(name) {
        // 构造函数的this指向实例化对象
        // 构造函数的作用就是给实例对象设置属性
        this.name = name
        // 动态添加属性(不推荐)
        this.foods = ['西红柿', '土豆']
      }
      // 公有方法
      sayHi() {
        console.log('hi');
        console.log(this.name);
      }
    }

    // 2.实例化对象
    const p = new Person('张三')
    console.log(p);
    p.sayHi()
  </script>
  • 创建类用class关键字
  • 类的实例化使用new关键字
  • 实例属性的初始化使用constructor关键字 (给类的属性设置值)

类的继承

extends关键字用于类声明或者表达式中, 以创建一个类, 该类是另一个类的子类

super关键字用于访问对象字面量或类的原型上的属性, 或调用父类的构造函数

复制代码
<script>
    class Person {
      name
      constructor(name) {
        this.name = name
      }
      sayHi(){
        console.log('父类的asyhi');
      }
    }

    // --------------子类----------------
    class Student extends Person {
      age
      constructor(name, age) {
        // 继承环境中, 如果子类有自己的属性, 就必须调用super, 否则会报错
        super(name)
        this.age = age
      }
      // 同名方法, 就近原则
      sayHi() {
        console.log('子类的asyHi');
      }
    }
  
    const p = new Student('张三', 18)
    p.sayHi()
  </script>
  • 类的继承使用extends关键字
  • 如果子类有自己的属性, 必须使用super关键字

静态属性

静态: 通过static关键字定义静态属性和方法, 所谓静态就是只能通过类调用, 不能通过实例调用

复制代码
<script>
    /**
     * 静态属性:
     *    定义: static
     *    访问: 通过类访问
    */
   class Test {
    // 静态属性和方法
    static name = '我是静态属性'
    static func() {
      console.log('我是静态方法');
    }
   }

   // 访问静态属性和方法
  console.log(Test.name); //我是静态属性
  Test.func() // 我是静态方法
  </script>

可见性修饰符

私有: 类属性在默认情况下是公有的, 可以通过 前缀 # 定义私有字段, 声明和访问时都需要

复制代码
<script>
    /**
     * 私有属性:
     *    定义: #name
     *    访问: #name, 
     *    范围: 只能在类的内部访问
     *    # 是简写形式, 完整的修饰符是 private 
    */
   class Test {
    // 私有属性
    #info = '我是私有属性1'
    private info2 = '我是私有属性2'
    // 私有方法
    #func() {
      console.log('我是私有方法');
    }
    testPr() {
      console.log(this.#info);
      this.#func()
    }
   }


  // 通过实例方法访问私有属性
  const t = new Test()
  t.testPr() // 我是私有属性,我是私有方法

  // 类的外部, 无法访问私有属性和方法
  // t.#func() // 报错
  
  // Chrome控制台中, 可以直接访问私有属性和方法(便于调试)
  // console.log(t.#info);
  </script>

// 公有属性:
class Animal {
  //定义: public修饰符(公有的)
  //范围: 让类中的所有成员对外可见(默认)
  public move() {
    log('1111')
  }
}


// 限制属性: 限制类中的成员对外可见
class Animal {
  // 定义: protected修饰符(受保护的)
  // 仅能在当前类和子类继承中可见,对实例不可见.
  protected move() {
    log('1111')
   }
}

// 只读修饰符:
class Animal {
  //定义: readonly 
  //范围: 无法在constructor构造函数之外对属性进行赋值 
  readonly age = 18
  constructor(age) {
      this.age = age
  }
}

接口

通过接口, 在不改变类的情况下, 增强类的功能和灵活性

复制代码
// 定义: interface关键字
interface 接口1 {
  name
  sing()
}

// 继承: implements关键字
// 类实现接口,类必须提供接口中指定的所有方法和属性
class 对象 implements 接口1 {
   name='小明'
   sing() { log('1111') }
}
相关推荐
开开心心就好13 分钟前
Word图片格式调整与转换工具
java·javascript·spring·eclipse·pdf·word·excel
Stringzhua22 分钟前
JavaScript【5】DOM模型
开发语言·javascript·ecmascript
90后小陈老师23 分钟前
WebXR教学 07 项目5 贪吃蛇小游戏
前端·数码相机
一口一个橘子25 分钟前
[ctfshow web入门] web118
前端·web安全·网络安全
GanGuaGua41 分钟前
Vue3:脚手架
前端·javascript·css·vue.js·vue
weixin_431600441 小时前
使用 Vue Tour 封装一个统一的页面引导组件
javascript·vue.js·ecmascript
鸡吃丸子2 小时前
常见的实时通信技术(轮询、sse、websocket、webhooks)
前端·websocket·状态模式
胡斌附体2 小时前
vue添加loading后修复页面渲染问题
前端·javascript·vue.js·渲染·v-if·异步加载
Dontla2 小时前
Webpack DefinePlugin插件介绍(允许在编译时创建JS全局常量,常量可以在源代码中直接使用)JS环境变量
运维·javascript·webpack
酷爱码3 小时前
css中的 vertical-align与line-height作用详解
前端·css