【JavaScript高级】class类、ES6实现继承、ES6对象增强

2023-11-05

class类

ES6(ECMAScript2015)新的标准中使用了class关键字来直接定义类。

有两种定义方式:类声明和类表达式。

注意: 类结构中定义多个内容, 不需要加逗号进行分隔

//类声明
class Person{

}

//类表达式
var Student=class{
    
}

构造函数

  • 每个类都可以有一个自己的构造函数(方法),这个方法的名称是固定的constructor
  • 通过new操作符,操作一个类的时候会调用这个类的构造函数constructor
  • 每个类只有一个构造函数,如果包含多个构造函数,那么会抛出异常

当我们通过new关键字操作类的时候,会调用这个constructor函数,并且执行如下操作:

  1. 在内存中创建一个新的空对象
  2. 这个对象内部的prototype属性会被赋值为该类的prototype属性
  3. this指向创建出来的新对象
  4. 执行构造函数的内部代码(函数体代码)
  5. 如果构造函数没有返回非空对象,则默认返回创建出来的新对象

实例的隐式原型会绑定Person的显式原型

class Person {
  // 类中的构造函数
  // 当我们通过new关键字调用一个Person类时, 默认调用class中的constructor
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

var p1 = new Person("coder", 18);

console.log(p1.name, p1.age); // coder 18
// 实例的隐式原型会绑定Person的显式原型
console.log(p1.__proto__ === Person.prototype); // true

注意: function定义的类可以作为普通函数去调用; class定义的类, 不能作为一个普通函数调用

访问器方法:getter和setter

对象的访问器方法:通过属性描述符定义访问器

var obj = {
  // 程序员之间的约定: 以下划线开头的属性和方法, 是不在外界访问的
  _name: "kaisa"
}

Object.defineProperty(obj, "name", {
  set: function(value) {
    this._name = value
  },
  get: function() {
    return this._name
  }
})

class的访问器方法:

class Person {
  constructor(name, age) {
    this.name = name;
    this._age = age;
  }

  set age(value) {
    this._age = value;
  }

  get age() {
    return this._age;
  }
} 

静态方法

ES5的静态方法:在类上添加或调用的方法。

function Person() {}
// 添加实例方法
Person.prototype.running = function() {}

// 添加静态方法(类方法)
Person.eating = function() {}

var p1 = new Person()
p1.running() // 调用实例方法
Person.eating() // 调用静态方法

ES6中class, 使用static关键字来定义静态方法(类方法):

class Person {
  // 实例方法
  eating() {}
  running() {}

  // 类方法
  static studying() {}
}
var p1 = new Person();
p1.running(); // 调用实例方法
p1.eating(); // 调用实例方法

Person.studying(); // 调用类方法

注意: 实例方法的this指向实例对象, 静态方法的this指向类

ES6实现继承

extends

关键字:extends

//父类
class Person{
    constructor(name,age){
        this.name=name;
        this.age=age;
    }

    running(){
        console.log("runninng!");
    }
}

//子类
class Student extends Person{
    constructor(name,age,id){
        //super 调用父类构造函数, 将属性传进去
        super(name,age);
        this.id=id;
    }

    studying(){
        console.log("studying!");
    }
}

//子类实例
var stud1=new Student("a",18,1);
stud1.running()//runninng!
stud1.studying()//studying!

super

  • super.method(…):调用一个父类方法
  • super:调用父类constructor(只能在constructor中使用)

注意:

  • (派生)类的构造函数中使用this或者返回(return)默认对象之前,必须先通过super调用父类的构造函数
  • 使用位置:子类的构造函数、实例方法、静态方法(类方法)

位置一:举例如上

位置二:实例方法

class Person{
    running(){
        console.log("Person running!");
    }
}

class Student extends Person{
    running(){
        //调用父类的running
        super.running();
        //子类的running
        console.log("Studeng running!");
    }
}

var stu1=new Student();
stu1.running();//Person running! Studeng running!

位置三: 静态方法——注意要通过类调用

class Person{
    static running(){
        console.log("static Person running!");
    }
}

class Student extends Person{
    static running(){
        super.running()
        console.log("static Student running!");
    }
}

//要通过类调用
Student.running()//static Person running!  static Student running!

继承内置类

让我们的类继承自内置类,如:

class MyArray extends Array {
    lastItem(){
        return this[this.length-1];
    }
}

var arr = new MyArray(1,2,3,4,5);
console.log(arr.lastItem());//5

也可以直接对Array进行扩展,如:

Array.prototype.lastItem = function() {
  return this[this.length - 1]
}

var arr = new Array(10, 20, 30, 40);
console.log(arr.lastItem()); // 40

类的混入(了解)

JavaScript的类只支持单继承:也就是只能有一个父类。

若我们需要在一个类中添加更多相似的功能时,可以使用混入(mixin)

//传入一个类,返回一个类
//这个类继承自传入的类,并添加running方法
function mixinRun(BaseClass){
    return class extends BaseClass{
        running(){
            console.log("running!");
        }
    }
}

function mixinFly(BaseClass){
    return class extends BaseClass{
        flying(){
            console.log("flying!");
        }
    }
}

class Bird{
    eating(){
        console.log("eating!");
    }
}

//把Bird跟Fly、Run混在一起,得到一个会飞会跑的小鸟
class newBird extends mixinFly(mixinRun(Bird)){}

var bird=new newBird();

bird.flying()//flying!
bird.running()//running!
bird.eating()//eating!

这种写法和react的高阶组件中的写法是非常相似。

ES6对象的增强

字面量的增强

增强对象字面量:Enhanced object literals。主要包括:

  1. 属性的简写
  2. 方法的简写
  3. 计算属性名

1.属性的简写

简写前:

var name = "kaisa";
var age = 18;

// 一般情况写我们会这样写
var obj = {
  name: name,
  age: age
};

简写后:key和value的标识符一样的情况下可以使用

var name = "kaisa";
var age = 18;

// 属性的增强写法
var obj = {
  name,
  age
};

2.方法的简写

简写前:

var obj = {
  running: function () {},
  eating: function () {},
};

简写后:

var obj = {
  running() {},
  eating() {},
};

3.计算属性名

想要使用变量key的值, 作为obj对象的属性名:

var key = "address";

var obj = {
  [key]: "成都市",
};

console.log(obj.address); // 成都市

解构

ES6中新增了一个从数组或对象中方便获取数据的方法,称之为解构Destructuring。分为:

  1. 数组的解构
  2. 对象的解构

1.数组的解构

基本解构:

var names=["a","b","c","d"]

var [n1,n2,n3]=names
console.log(n1,n2,n3);//a b c

顺序解构:严格按顺序,不要的要空出来

var names=["a","b","c","d"]

var [n1,,n3]=names
console.log(n1,n3);//a c

…语法:…里的会放入一个新数组里

var names=["a","b","c","d"]

var [n1,...rest]=names
console.log(n1,rest);//a (3) ['b', 'c', 'd']

默认值:若某个值是undefined,我们可以给它赋值。

var names=["a","b",undefined,"d"]

var [n1,n2,n3="defined"]=names
console.log(n1,n2,n3);//a b defined

2.对象的解构

基本解构:

var obj={
    name:"name",
    age:18,
    height:1.88
}

var {name,height}=obj
console.log(name,height);//name 1.88

任意顺序:

var obj={
    name:"name",
    age:18,
    height:1.88
}

var {height,name}=obj
console.log(height,name);//1.88 'name'

重命名:对变量进行重命名

var obj={
   name:"name",
   age:18,
   height:1.88
}

var {name:namee,height:heightt,age:agee}=obj
console.log(namee,heightt,agee);//name 1.88 18

默认值:可以添加key并对其设置默认值

var obj={
    name:"name",
    age:18,
    height:1.88
}

var {
    name,age,address:Address="add"
}=obj;

console.log(name,age,Address);//name 18 add

…语法:

var obj={
    name:"name",
    age:18,
    height:1.88
}

var {name,...rest}=obj
console.log(rest);//{age: 18, height: 1.88}

解构相关应用

function getPosition({x,y}){
    console.log(x,y);
}

//相当于做了{x,y}={x:10,y:100}这个操作
getPosition({x:10,y:100});

多态

  • 为不同数据类型的实体提供统一的接口,或使用一个单一的符号来表示多个不同的类型
  • 不同的数据类型进行同一个操作,表现出不同的行为

如:

function sum(a,b){
    console.log(a+b);
}

sum(1,2)//3
sum("1","2")//12

参考

coderwhy的课
JavaScript中class类、ES6中实现继承的方法
JavaScript面向对象(3)—深入ES6的class
JavaScript中ES6对象的增强使用、解构、多态

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JavaScript高级】class类、ES6实现继承、ES6对象增强 的相关文章

  • 为什么 setInterval 会无限循环

    我正在尝试设置一个计时器 以便它显示用户的秒数和分钟剩余时间 并且我正在使用setInterval获取秒数 如果有 60 秒 则会从用户处减少 1 分钟 问题是我变得无限for每次我尝试这样做时都会循环 就像是 var userObj na
  • 如何在 contenteditable 中跟踪插入符/光标?

    我想在 contenteditable 中跟踪插入符 光标的移动 不过 我不确定最好的方法是什么 我目前正在监听点击 按下键盘 按下键盘的声音 当然 像箭头键或 ctrl x 这样的按键甚至不会触发 虽然 click 工作正常 但 keyd
  • 如何提取 Backbone 集合的属性

    我想从 Backbone 集合创建一个特定属性值的数组 var days select this collection models function model return model attributes type session d
  • 该脚本在 IE 中不起作用。我该如何修复它?

    有一个脚本可以根据用户的显示器屏幕分辨率更改页面模板 但是 它在 IE 中不起作用 请告知如何修复它 table align center tr td head td tr tr td nbsp td td nbsp td td nbsp
  • 最小有效 JSON 是多少?

    我仔细阅读了 JSON 描述http json org http json org 但我不确定我是否知道这个简单问题的答案 最小可能的有效 JSON 字符串是什么 string 该字符串是有效的 JSON 吗 42简单的数字是有效的 JSO
  • div 准备好后如何调用函数?

    我的 javascript 文件中有以下内容 var divId divIDer jQuery divId ready function createGrid Adds a grid to the html html 看起来像这样 div
  • 如何使用 JavaScript 或 jQuery 清除 Google Chrome、Mozilla Firefox 和 Safari 中的剪贴板数据

    我正在开发一个网站 我想在使用 JavaScript 或 jQuery 查看我的网站时按下打印屏幕按钮时清除剪贴板数据 谁能帮我解决这个问题 我在 Internet Explorer 中成功处理了这个问题 提前致谢 由于安全原因 您无法使用
  • 在 vuejs 上将 \n 替换为新行

    我正在尝试将 n 字符替换为来自端点的数据的新行 I tried p item licensedocument legal documentText replace r n r n g br p 并没有奏效 当我将replace 写入问题末
  • 动画和过渡的组合无法正常工作

    我一直在尝试添加一些基本的 CSS3 动画 目标是在按钮的单击事件上切换类 并根据添加的类对 div 进行动画处理 该代码对于 Firefox 中切换的第一次迭代完美运行 但对于 Chrome 等其他浏览器以及 Firefox 中的下一次迭
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • innerText 和 html 之间的区别

    有什么区别innerText text and html innerText or text http docs jquery com Attributes text如果您使用的是 jQuery 不包含任何 HTML 标签 因此 如果您有一
  • JavaScript 语法是什么:{Ci, CC}? [复制]

    这个问题在这里已经有答案了 我正在做一些 FF 附加开发 我看到这样的语法 var Cc Ci require chrome 只是好奇这个语法是什么 以及它是否对 FF 开发或其他东西有特殊意义 这称为解构赋值 它的一个特点是JavaScr
  • Vue: vue-i18n: 无法翻译 keypath 的值,使用 keypath 的值作为默认值

    我正在使用 Vue 我想展示三种语言 英语 他加禄语和宿务语 现在我有错误 无法转换键路径 NavbarMobile home 的值 使用 keypath 的值作为默认值 我通过 console log this i18n locale 检
  • jQuery/JavaScript“this”指针混淆

    当函数时 this 的行为bar被称为让我困惑 请参阅下面的代码 当从单击处理程序调用 bar 时 有什么方法可以将 this 安排为普通的旧 js 对象实例 而不是 html 元素 a class with a method functi
  • 谷歌colab录音,如何实现更精确的方式告诉用户开始对着麦克风说话

    我正在尝试创建一个为机器学习项目录制音频的程序 我想使用 google colab 这样人们就不必在他们的系统上安装或运行任何东西 我在网上找到了这个录制和播放音频的示例 单元格 1 包含用于录制音频的 js 代码和用于将其转换为字节对象的
  • 以编程方式将子节点添加到 jstree

    我正在尝试编写一些动态添加节点到 jstree 的代码 我已经关注了医生http www jstree com documentation crrm http www jstree com documentation crrm但无法获得一个
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 将 async 和await 与export const 一起使用

    我无法完成这项工作 它说 await 是一个保留字 是的 当然是 而且我想使用它 怎么了 export const loginWithToken async gt return dispatch gt dispatch type SESSI
  • 如何阻止用户重复单击 jQuery AJAX 调用?

    我有一个包含以下脚本的网页 JavaScript function LinkClicked var stage this id var stop ContentPlaceHolderMenu txtDate val var nDays Co
  • Tizen SDK:找不到变量:tizen

    我正在尝试使用 Tizen SDK 创建一个 Web 应用程序 当我启动应用程序时 一切都很好 但是当我在模拟器上按 后退 按钮时 没有任何反应 并且我看到一条消息 55435 js main js 9 ReferenceError 找不到

随机推荐

  • FutureTask 源码 并发设计模式

    一 代码 https www jianshu com p 60f661d95d53 public static void main String args throws Exception Callable
  • spring应用上下文的理解

    spring应用上下文的理解 容器 什么叫容器呢 如果你想要一个手机 好这时候spring就给你一个手机 你想要使用的对象 spring就会给你 但是现在我们就会问那spring给的对象来自于哪里呢 spring要负责的工作很多 那么多对象
  • Matlab矩阵

    1 通用的特殊矩阵 zeros函数 产生全0矩阵 ones函数 产生全1矩阵 eye函数 产生对角线为1的矩阵 当矩阵是方阵时 得到一个单位矩阵 rand函数 产生 0 1 区间均匀分布的随机矩阵 randn函数 产生均值为0 方差为1的标
  • Bootstrap统计学方法简介以及中心极限定理

    一 概念 Bootstrap 一词出自英文习语 pull yourself up by your bootstraps 它的隐含意是 improve your situation by your own efforts 即 通过你自己的努力
  • 163免费企业邮箱申请后怎么登陆?

    163免费企业邮箱目前的用户已经很多了 而关于申请的流程却并不多 很多人想用却不知道怎么注册申请 申请后又不清楚怎么登陆 下面小编为您讲解163免费企业邮箱注册申请及登陆流程 163免费企业邮箱注册申请 搜索163免费企业邮箱 打开企业邮箱
  • Git---企业级开发模型

    文章目录 前言 拓展 一 系统开发环境 二 Git分支设计规范 master分支 release分支 develop分支 feature分支 hotfix分支 三 企业级项目管理实战 准备工作 创建项目 创建仓库 添加成员 1 添加企业成员
  • redis分页查询代码实现

    redis分页查询 简单明了代码实现 本文是个基于redis的分页查询实现 场景描述 Redis分页自定义包装类 收藏和取消收藏biz业务处理 查询收藏数 查询用户收藏状态 分页查询我的收藏 本文是个基于redis的分页查询实现 本人业务开
  • 【JavaScript】Math 对象常见方法详解

    文章目录 JavaScript Math 对象常见方法详解 Math常见的方法 1 Math random 2 Math round 3 Math ceil 4 Math floor 5 Math abs 6 Math min 7 Math
  • Promise,async,await 面试题

    目录 5 面试题 1 2 3 4 5 6 7 推荐先看Promise 相关知识点 5 面试题 1 结果 1 5 2 3 4 const promise new Promise resolve reject gt console log 1
  • 前端自测运行vue打包后的dist文件

    在Vue项目中 dist目录是代码打包之后生成的文件夹 其中包含了静态资源文件和打包后的JavaScript CSS等文件 如果要在本地运行打包后的项目文件 可以使用简单的静态服务器来启动 下面介绍一种使用Node js中的http ser
  • 基于STC15单片机-LM35-DS8B20温度测量-DS1302计时-proteus仿真-源程序

    一 系统方案 1 本设计采用STC15单片机作为主控器 2 DS18B20采集温度值送到液晶1602显示 3 DS1302计时 日期送到液晶1602显示 4 LM35采集另一路温度值送到数码管显示 二 硬件设计 原理图如下 三 单片机软件设
  • Ubuntu16.04下 用Caffe训练自己的网络和模型并测试

    1 准备图片 训练太久就不放那么多图片了 在caffe根目录下data中新建文件夹6class 意思是6类 在6class文件夹下新建两个文件夹train和val train用来存放训练的图片 在train文件夹下新建6个文件夹0 5 图片
  • Base64编码图片转换成图片文件通用转换器(Java)

    Base64编码图片转换成图片文件通用转换器 Java 在本文中 我们将介绍如何使用Java实现将Base64编码的图片转换为图片文件的通用转换器 我们以将Base64编码转换为PNG图像文件为例 但同样的方法适用于其他图片格式 Base6
  • [LeetCode .213] House Robber II

    声明 题目来自Leetcode You are a professional robber planning to rob houses along a street Each house has a certain amount of m
  • java后台实现模拟登陆

    一 原理 客户端访问服务器 服务器通过Session对象记录会话 服务器可以指定一个唯一的session ID作为cookie来代表每个客户端 用来识别这个客户端接下来的请求 我们通过Chrome浏览器进行网页访问时 服务器会在我们第一次请
  • NFS服务器设置及mount命令挂载

    一 NFS服务器的设定 NFS服务器的设定可以通过 etc exports这个文件进行 设定格式如下 分享目录 主机名称或者IP 参数1 参数2 arm2410s 10 22 22 rw sync no root squash 可以设定的参
  • Charles使用教程

    Charles Charles 是一款收费的抓包修改工具 易上手 数据请求容易控制 修改简单 抓取数据的开始暂停方便等优势 下面详细介绍下这款强大好用的抓包工具 抓包 packet capture 就是将网络传输发送与接收的数据包进行截获
  • 在Win10中安装虚拟机:VMware Workstation Pro16+Ubuntu20.04

    引言 本篇首先在Win10中安装虚拟机工具软件VMware Workstation Pro 然后按照鸿蒙设备开发环境的要求 用VMware Workstation Pro创建一个虚拟机 最后在虚拟机上安装Ubuntu20 04系统 鸿蒙设备
  • python 【raise函数】

    一 raise函数的作用 抛出自定义的异常 stackoverflow社区里面常说的 Manually raising throwing an exception in Python 这个manually解释的就很到位 是人工的 自己定义的
  • 【JavaScript高级】class类、ES6实现继承、ES6对象增强

    文章目录 class类 构造函数 访问器方法 getter和setter 静态方法 ES6实现继承 extends super 继承内置类 类的混入 了解 ES6对象的增强 字面量的增强 解构 解构相关应用 多态 参考 class类 ES6