好家伙,我们先来复习一下

 

关于Java,类的三大特征:

1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

2、继承,继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。

3、多态,体现为覆盖和重载,Js没有重载,有时子类并不想原封不动地继承父类的方法,而是想作一定的修改。

这时我们可以对方法进行重写,也就是方法覆盖

 

1.类的定义

先来试用一下

function functionPerson(){}
class classPerson{
} console.log(functionPerson.prototype)
console.log(classPerson.prototype)

(猜猜看跑完什么结果?)

 

所以我们知道,虽然ECMAScript 6类表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的仍然是原型和构造函数的概念。

(还是原型链那一套)

2.类的构造函数

类可以包含构造函数方法、实例方法、获取函数、设置函数和静态类方法,但这些都不是必需的。

使用new操作符实例化Person的操作等于使用new调用其构造函数。

唯一可感知的不同之处就是,JavaScript解释器知道使用new和类意味着应该使用constructor函数进行实例化。

使用new调用类的构造函数会执行如下操作。

(1)在内存中创建一个新对象。

(2)这个新对象内部的[[Prototype]]指针被赋值为构造函数的prototype属性。

(3)构造函数内部的this被赋值为这个新对象(即this指向新对象)。

(4)执行构造函数内部的代码(给新对象添加属性)。

(5)如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

3.原型方法

类定义语法把在类块中定义的方法作为原型方法。

(例子跟下面的放一起了)

4.静态类方法

可以在类上定义静态方法。这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例。

与原型成员类似,静态成员每个类上只能有一个。

静态类成员在类定义中使用static关键字作为前缀。在静态成员中,this引用类自身。其他所有约定跟原型成员一样:

  class Person {
constructor() {
// 添加到this的所有内容都会存在于不同的实例上
this.locate = () => console.log('instance', this);
}
// 定义在类的原型对象上
locate() {
console.log('prototype', this);
}
//定义在类本身上
static locate(){
console.log('class', this);
}
}
let p = new Person();
p.locate(); // instance, Person {}
Person.prototype.locate(); // prototype, {constructor: ... }
Person.locate(); // class, class Person {}

(书中原例,)

 

5.继承extend

类继承使用的是新语法,但背后依旧使用的是原型链。

使用extends关键字,就可以继承任何拥有[[Construct]]和原型的对象。

很大程度上,这意味着不仅可以继承一个类,也可以继承普通的构造函数(保持向后兼容)

class Person {}
function Cat() {}
class Somebody extends Person {}
class Bosicat extends Cat {} let a = new Somebody();
let b = new Bosicat();
console.log(a instanceof Person);
console.log(b instanceof Cat);

(通过继承function这点看出,Js终于洗清了他的嫌疑,它确实和Java没关系)

6.super关键字

派生类的方法可以通过super关键字引用它们的原型。

这个关键字只能在派生类中使用,而且仅限于类构造函数、实例方法和静态方法内部。

在类构造函数中使用super可以调用父类构造函数。

class Cat{
constructor(){
this.age = '2'
}
} class Bosicat extends Cat{
constructor(){
super();
console.log(this);
}
} new Bosicat;

 

在使用super时要注意几个问题。

(1)super只能在派生类构造函数和静态方法中使用。

(2)不能单独引用super关键字,要么用它调用构造函数,要么用它引用静态方法

(3)调用super()会调用父类构造函数,并将返回的实例赋值给this。

(4)super()的行为如同调用构造函数,如果需要给父类构造函数传参,则需要手动传入。

(5)如果没有定义类构造函数,在实例化派生类时会调用super(),而且会传入所有传给派生类的参数

(6)在类构造函数中,不能在调用super()之前引用this。

(7)如果在派生类中显式定义了构造函数,则要么必须在其中调用super(),要么必须在其中返回一个对象。

第119篇: JavaScript 类的更多相关文章

  1. JavaScript学习总结(十三)——极简主义法编写JavaScript类

    前两天在网上无意中发现了一篇使用极简主义法定义JavaScript类的文章,原文链接,这个所谓的"极简主义法"我还是第一次听说,是荷兰程序员Gabor de Mooij提出来的,这 ...

  2. 你需要知道的 JavaScript 类(class)的这些知识

    作者: Dmitri Pavlutin译者:前端小智来源:dmitripavlutin 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经 ...

  3. JavaScript 类式继承与原型继承

    交叉着写Java和Javascript都有2年多了,今天来总结下自己所了解的Javascript类与继承. Javascript本身没有类似Java的面向对象的类与继承术语,但其基于原型对象的思想却可 ...

  4. 第九章:Javascript类和模块

    (过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某 ...

  5. 一种JavaScript 类的设计模式

    一种JavaScript 类的设计模式尽管前面介绍了如何定义一个类,如何初始化一个类的实例,但既可以在function定义的函数体中添加成员,又可以用prototype 定义类的成员,代码显的很混乱, ...

  6. JavaScript “类”定义 继承 闭包 封装

    一.Javascript “类”: 类:在面向对象编程中,类(class)是对象(object)的模板,定义了同一组对象(又称"实例")共有的属性和方法. Javascript是一 ...

  7. JavaScript类继承, 用什么方法好

    JavaScript类继承, 用什么方法好 一个实例: 基类Car: function Car(color, year) { this.name = "car"; this.col ...

  8. javascript类式继承最优版

    直接看实例代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...

  9. JavaScript类数组转换为数组 面试题

    1.JavaScript类数组转换为数组 (1)方法一:借用slice (2)方法二:Array.from 2.代码 <!DOCTYPE html> <html lang=" ...

  10. 13.JavaScript 类

    JavaScript 类 JavaScript 是面向对象的语言,但 JavaScript 不使用类. 在 JavaScript 中,不会创建类,也不会通过类来创建对象(就像在其他面向对象的语言中那样 ...

随机推荐

  1. github-keydb 知识

    https://github.com/Snapchat/KeyDB KeyDB is now a part of Snap Inc! Check out the announcement here R ...

  2. redis 设置密码之后,通过命令行一键刷新的办法

    之前以为很麻烦 发现还是自己太low了. redis-cli -a Test1127 flushall

  3. k8s单master集群通过备份etcd还原集群

    准备环境 通过kubeadm 安装的单master kubernetes 1.19+ 集群 容器环境:containerd 客户端工具:kubeadm.kubectl.etcdctl.crictl 备 ...

  4. 【VictoriaMetrics源码阅读】vm中仿照RoaringBitmap的实现:uint64set

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 正文 VictoriaMetrics中使用uint64类型来表示一个Me ...

  5. Gorm 入门介绍与基本使用

    Gorm 入门介绍与基本使用 目录 Gorm 入门介绍与基本使用 一.ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1 ...

  6. Windows 核心编程笔记 [1] Windows 错误处理

    [1] Windows 错误处理 1. 关于windows系统函数的返回值错误处理 VOID:这个函数不可能失败 BOOL:如果函数调用失败,返回值为0,即为FALSE,否则为非0值,即为TRUE H ...

  7. MacType更好的字体渲染

    初步尝试 下载 noMeiryoUI 和 苹果简方字体,通过noMeiryoUI替换系统字体 建议使用苹果简方 常规体 10px,字体下载地址 mactype 我的系统:win10 lts 1809, ...

  8. Markdown常用书写语法合集

    1. 文字设置 1.1 文字颜色 中常用的文字颜色有: 红色文字:<font color="red">红色文字</font> 浅红色文字:<font ...

  9. Python Selenium 库使用技巧

    Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE,Mozilla Firefox,Safari,Google ...

  10. ECMAScript 2023 新特性预览

    ECMAScript 2023 的最终版本预计将于今年 6 月底发布.会议基本已经确定 了 ECMAScript 2023 的新功能列表,预计不会再有任何重大的编辑更改. 着该提案已被 ECMAScr ...