一, class和自定义类型的区别:

  1,类声明不会被提升。

  2,类声明的代码自动运行在严格模式。

  3,类的所有方法都是不可枚举的,而自定的方法必须使用Object.defineProperty来设置。

  4,类的所有方法都没有[[Construct]],因此用new来调用会报错。

  5,调用类构造器不使用new 会报错。

  6,视图在类的内部重写类名会报错。

二,类的生成器方法

  可以使用 Symbol.iterator来定义生成器方法,来生成类的默认迭代器。

class Iterator{
constructor() {
this.arr = [1,2,3,4];
}
*[Symbol.iterator]() {
yield *this.arr.values();
}
} let iter = new Iterator();
for (let i of iter) {
console.log(i)
}

  这样每个实例就都可以使用for of来使用。

三, 静态成员

  class中的静态方法 是直接在方法前加上static关键字。

  静态属性的写法:

class Foo{}
Foo.a = 1;
console.log(Foo.a);

四,继承

  使用extends关键字进行继承。

  只要一个表达式能够返回一个具有[[Construct]]属性以及原型的函数,就可以对其使用extends。

function Animal(name){ this.name = name;}
Animal.prototype.getName = function(){ console.log(this.name)}; class Sheep extends Animal{
constructor(name) {
super(name)
}
}
let sheep = new Sheep('yz');
sheep.getName();

  上面的Animal是es5的构造器,但也满足上面的要求,因此可以直接使用extends被继承。

    由于extends后可以接受任意的表达式,那么自然而然也可以创建混入:

const Mixin1 = {
getName(){ console.log(this.name)}
} const Mixin2 = {
addName() { console.log(this.name + this.age)}
} function mixin (...mixinObj){
let base = function () {};
Object.assigin(base.prototype, ...mixinObj);
return base;
} class MinxinAll extends mixin(Mixin1, Mixin2){
constructor(name, age){
super();
this.name = name; this.age = age;
}
}

  这样所有MinxinAll的实例都可以使用 混入对象的方法。  若多个混入的对象有相同的属性, 则只有最后被添加的属性会被保留。

  使用extends的子类, 也可以继承父类的静态成员。

五,super

  super只能在子类中使用,如果在没有extends的类中使用会报错。

  在构造器中,必须在访问this之前调用super();因为super是用来初始化this的。

  子类中可以使用super.方法()来访问原型的方法。

  当然,箭头函数无super。

  由于super是用来生成this的, 如果你只是想继承原型,而对父类的构造器没兴趣, 可以在constructor中不使用super,返回一个对象即可。

class A {
getOne() { return 1;}
}
class B extends A {
constructor() {
return Object.create(new.target.prototype);
}
getTwo() { return 2;}
} let n = new B();
n.getOne();
n.getTwo();

  

六,继承内置对象与Symbol.species属性

  继承内置对象的 子类, 调用内置对象的方法,返回的结果是子类的实例。

  比如:

class MyArray extends Array{}

let arr = new MyArray(1,2,3,4,5);
let newArr = arr.slice(1, 4);
// 按理来说 调用了slice之后,生成的应该是数组,结果返回的newArr却是 MyArray的实例

  Symbol.species 知名符号被用于 定义一个能返回函数的静态访问器属性。一般默认拥有Symbol.species属性的类型默认返回的都是this,即自身的构造器。

  子类继承的时候,可以重写 Symbol.species属性来指定生成的实例属于何种类型。

七, new.target

  在简单的情况下, new.target就等于本类的构造函数。  这样的话,可以通过使用new.target来创建一个抽象基类。  即只能被继承,自身不能实例化的类。

  

class Animal {
constructor() {
if (new.target === 'Animal') {
throw new Error('此类不能被实例化')
}
}
} class Row extends Animal{
constructor(name) {
super();
this.name = name;
}
} let r = new Row('yz'); // 正常 let a = new Animal(); // 抛出错误。

  

 

  

  

深入理解class的更多相关文章

  1. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  2. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  3. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  6. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  7. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

  8. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  9. 深入理解JS 执行细节

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...

  10. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

随机推荐

  1. struts2--action请求与Action类

    1.action:代表一个sturts2的请求: 2.Action类:能够处理Struts2请求的类: --属性名必须遵守与JavaBean属性名相同的命名规则: --属性的类型可以使任意类型.从字符 ...

  2. Element 表单校验不消失问题

    由于不好的命名习惯,所以我的:rule   :ref   :model命名就是写了改,改了再写. 直到今天出现了这个毛病就是  “表单验证不消失” 比方说这里的  ‘密码不能为空’,在我已经输入了数字 ...

  3. 关于fpga的后仿真重要性

    也许你天天做些fpga,写完代码就直接编译成功,锁定引脚后,马上使用signaltaII软件. 也许你一天,你发现signaltapII看信号的痛苦,一个源代码文件修改一点,要花个20分钟编译一次. ...

  4. 图论初步2<蒟蒻专属,大佬勿喷>

    前言: 本节课讲的是图论的几种遍历方式,若没看图论初步1的赶紧去看 https://www.cnblogs.com/Craker/p/12271090.html 正文: 零.温故而知新 上节课我们学的 ...

  5. jmeter学习笔记---循环控制器计数器函数助手

    循环控制器与计数器,以及函数助手需要配合使用,实现循环 循环控制器的“循环次数”输入最大循环次数的参数 计数器:除输入最大值外,还需要输入“引用名称”,供后续请求使用 请求中,如果需要实现循环,需要借 ...

  6. PAT (Advanced Level) 1124~1127:1124模拟 1125优先队列 1126欧拉通路 1127中序后序求Z字形层序遍历

    1124 Raffle for Weibo Followers(20 分) 题意:微博抽奖,有M个人,标号为1~M.从第S个人开始,每N个人可以获奖,但是已获奖的人不能重复获奖,需要跳过该人把机会留给 ...

  7. dubbo-admin的安装使用

    dubbo-admin下载地址:https://github.com/apache/incubator-dubbo/releases 可以直接下载到linux上 wget https://github ...

  8. Ubuntu19.04的安装过程详解以及操作系统初始化配置

    Ubuntu19.04的安装过程详解以及操作系统初始化配置                                                                       ...

  9. 英语语法 - the + 形容词 的意义

    1,表示一类人  (复数) the young 青年 the old 老年the poor 穷人 the rich 富人the sick 病人 The old need care more than ...

  10. 指令——ps -ef

    一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. 指令:ps [process  show] 作 ...