ES6学习之Class
一、定义类(ES6的类,完全可以看做是构造函数的另一种写法)
- class Greet {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
- sayHello() {
- console.log(this.x + " " + this.y)
- }
- }
- let a = new Greet("hello", "everybody");
- a.sayHello() //hello everybody
《注》:
- 以上定义的类如果用ES5的构造函数实现如下:
- function Greet(x, y) {
- this.x = x;
- this.y = y;
- this.sayHello = function () {
- console.log(this.x + " " + this.y)
- }
- }
- let a = new Greet("hello", "everybody");
- a.sayHello() //hello everybody
- 类的数据类型就是函数,类本身就指向构造函数
- typeof Greet; //function
- Greet === Greet.prototype.constructor //true
- 类的所有方法都定义在类的
prototype
属性上面
- class Greet {
- constructor() {...}
- sayHello() {...}
- sayHi(){...}
- }
- 等同于
- Greet
- Greet.prototype = {
- constructor() {},
- sayHello() {},
- sayHi() {},
- };
- constructor方法:
- 是类的默认方法,通过
new
命令生成对象实例时,自动调用该方法。一个类必须有constructor
方法,如果没有显式定义,一个空的constructor
方法会被默认添加。
- class Greet {
- }
- // 等同于
- class Greet {
- constructor() {}
- }
constructor
方法默认返回实例对象(即this
),完全可以指定返回另外一个对象。
- class Foo {
- constructor() {
- return Object.create(null);
- }
- }
- new Foo() instanceof Foo
- // false
类的实例对象:
- 实例的属性除非显式定义在其本身(即定义在
this
对象上),否则都是定义在原型上(即定义在class
上)。
- class Greet {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
- sayHello() {
- console.log(this.x + " " + this.y)
- }
- }
- let a = new Greet("hello", "everybody");
- // x,y都是实例对象a自身的属性,因为定义在this上
- a.hasOwnProperty('x') // true
- a.hasOwnProperty('y') // true
- //sayHello是原型对象的属性,因为定义在Greet上
- a.hasOwnProperty('sayHello') // false
- a.__proto__.hasOwnProperty('sayHello') // true
- 类的所有实例共享一个原型对象
- let a = new Greet("hello", "everybody");
- let b = new Greet("hello", "everybody");
- a.__proto__ === b.__proto__ //true
Class表达式:
- const MyClass = class Me {
- getClassName() {
- return Me.name;
- }
- }; //类的名字是MyClass而不是Me,Me只在 Class 的内部代码可用,指代当前类。
- //如果类的内部没用到的话,可以省略Me
- const MyClass = class {
- ...
- };
不存在变量提升:必须先定义类,再使用
私有方法:
- 利用
Symbol
值的唯一性
- const bar = Symbol('bar');
- const snaf = Symbol('snaf');
- export default class myClass{
- // 公有方法
- foo(baz) {
- this[bar](baz);
- }
- // 私有方法
- [bar](baz) {
- return this[snaf] = baz;
- }
- // ...
- };
- 利用#标识:
- class Greet {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
- #sayHello() {
- console.log(this.x + " " + this.y)
- }
- }
Class 的取值函数(getter)和存值函数(setter):在“类”的内部可以使用get
和set
关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
- class MyClass {
- constructor() {
- // ...
- }
- get prop() {
- return 'getter';
- }
- set prop(value) {
- console.log('setter: '+value);
- }
- }
- let inst = new MyClass();
- inst.prop = 123;
- // setter: 123
- inst.prop
- // 'getter'
Class 的静态方法:加上static
关键字,表示该方法不会被实例继承,而是直接通过类来调用
- class Foo {
- static classMethod() {
- return 'hello';
- }
- }
- Foo.classMethod() // 'hello'
- var foo = new Foo();
- foo.classMethod()
- // TypeError: foo.classMethod is not a function
- 如果静态方法包含
this
关键字,这个this
指的是类,而不是实例 - 父类的静态方法,可以被子类继承
- 静态方法也是可以从
super
对象上调用的
Class 的静态属性和实例属性
- 静态属性指的是 Class 本身的属性,即
Class.propName
,而不是定义在实例对象(this
)上的属性,定义方法如下:
- class MyClass {
- static myStaticProp = 42;
- constructor() {
- console.log(MyClass.myStaticProp); //
- }
- }
- 类的实例属性可以用等式,写入类的定义之中
- class MyClass {
- myProp = 42;
- constructor() {
- console.log(this.myProp); //
- }
- }
new.target 属性:如果构造函数不是通过new
命令调用的,new.target
会返回undefined
用来确定构造函数是怎么调用的。
- function Person(name) {
- if (new.target !== undefined) {
- this.name = name;
- } else {
- throw new Error('必须使用 new 命令生成实例');
- }
- }
二、Class继承:通过extends
关键字实现继承
- class Point {
- }
- class ColorPoint extends Point {
- }
supper:
- 子类必须在
constructor
方法中调用super
方法(子类没有自己的this
对象,而是继承父类的this
对象,然后对其进行加工)
- class Point { /* ... */ }
- class ColorPoint extends Point {
- constructor() {
- }
- }
- let cp = new ColorPoint(); // ReferenceError
- 如果子类没有定义
constructor
方法,这个方法会被默认添加
- class ColorPoint extends Point {
- }
- // 等同于
- class ColorPoint extends Point {
- constructor(...args) {
- super(...args);
- }
- }
- 在子类的构造函数中,只有调用
super
之后,才可以使用this
关键字(子类实例的构建,是基于对父类实例加工,只有super
方法才能返回父类实例)
- class Point {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
- }
- class ColorPoint extends Point {
- constructor(x, y, color) {
- this.color = color; // ReferenceError
- super(x, y);
- this.color = color; // 正确
- }
- }
super
作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super
函数。且只能用在子类的构造函数之中,用在其他地方就会报错
- class A {}
- class B extends A {
- constructor() {
- super();
- }
- } //
super
虽然代表了父类A
的构造函数,但是返回的是子类B
的实例
super
作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。
a)普通方法中:
- class A {
- p() {
- return 2;
- }
- }
- class B extends A {
- constructor() {
- super();
- console.log(super.p()); //
- }
- } //指向父类的原型对象
- let b = new B();
b) 静态方法中:
- class Parent {
- static myMethod(msg) {
- console.log('static', msg);
- }
- myMethod(msg) {
- console.log('instance', msg);
- }
- }
- class Child extends Parent {
- static myMethod(msg) {
- super.myMethod(msg);
- }
- myMethod(msg) {
- super.myMethod(msg);
- }
- }
- Child.myMethod(1); // static 1
- var child = new Child();
- child.myMethod(2); // instance 2
ES6学习之Class的更多相关文章
- ES6学习目录
前面的话 ES6是JavaScript语言的下一代标准,已经在 2015 年 6 月正式发布.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 为什么要学 ...
- es6学习笔记-class之继承
继承 上一篇学习了class的概念,在es5时,对象的继承有好几种,原型链继承,借用构造函数继承,组合继承,原型式继承,寄生式继承以及寄生组合式继承,都是按照函数的形式去集成的,现在class也有它的 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- javascript的ES6学习总结(第二部分)
1.数组循环 介绍数组循环之前,先回顾一下ES5数组的循环 (1)数组遍历(代替普通的for):arr.forEach(callback(val,index,arr){todo}) //val是数组的 ...
- javascript的ES6学习总结(第一部分)
ES6(ESNext学习总结——第一部分) ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ECMA每年6月份,发布一个版本 201 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
随机推荐
- JVM垃圾回收时的可触及性
可触及的 1.从根节点可以触及到这个对象可复活的 1.一旦所有引用被释放,就是可复活状态 2.因为在finalize()中可能复活该对象不可触及的 1.在finalize()后,可能会进入不可触及状态 ...
- ubuntu查看Mysql是否已启动
sudo netstat -tap | grep mysql 命令行输出: tcp6 0 0 [::]:mysql [::]:* ...
- 树莓派+pythonista实时监控系统
客户端(pythonista) import ui from PIL import Image import socket, time, StringIO global closeFlat close ...
- vim python缩进等一些配置
VIM python下的一些关于缩进的设置: 第一步: 打开终端,在终端上输入vim ~/.vimrc,回车. 第二步: 添加下面的文段: set filetype=python au BufN ...
- CentOS iSCSI服务器搭建------Target篇
先上服务器信息(当然是我YY的服务器.哈哈) [root@node ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@node ...
- 3.26课·········window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docun ...
- 每天一个Linux命令(24)tar命令
tar命令可以为linux的文件和目录创建档案. (1)用法: 用法: tar [选项] [文件参数] (2)功能: 功能: 用来压缩和解压文件.tar本身不 ...
- 20145229吴姗珊 《Java程序设计》第6周学习总结
20145229吴姗珊 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入\输出 1.java将输入\输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象 2.输入串 ...
- hd acm1466
http://www.cnblogs.com/alihenaixiao/p/4107907.html#undefined.这个博客有详解,我这个只是写一些·自己的总结. 问题:平面上有n条直线,且无三 ...
- <Linux内核源码>内存管理模型
题外语:本人对linux内核的了解尚浅,如果有差池欢迎指正,也欢迎提问交流! 首先要理解一下每一个进程是如何维护自己独立的寻址空间的,我的电脑里呢是8G内存空间.了解过的朋友应该都知道这是虚拟内存技术 ...