ES6之class

解决的问题

更加清晰的书写继承,面向对象编程

基本语法

constructor

  1. 构造方法,this关键字代表构造对象
  2. new一个类时,自动执行该方法
  3. 必须有constructor,没有的话一个空的方法会被默认添加
  4. constructor默认返回该对象实例(this),也可以手动更改

函数

不用加function以及逗号,以下为es5和es6对比

function Point(x, y) {
this.x = x;
this.y = y;}

Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';};

var p = new Point(1, 2);
//定义类
class Point {
  constructor(x, y) {
this.x = x;
this.y = y;
}
  toString() {
return '(' + this.x + ', ' + this.y + ')';
}}

使用

class Bar {
  do Stuff(){
    console.log('stuff');
  }
}
var b = new Bar();
b.doStuff() //  "stuff"

通过new
原理
可以把类,看作构造函数的另一种写法

class Pointer{
}
typeof Pointer //function
Pointer == Pointer.prototype.constructor //true

以上表示类的数据类型是函数,并且类本身指向其构造函数

类的实例对象

  1. 必须使用new操作符实例化对象
  2. 由于类的方法都是通过prototype实现的,因此可以像这样添加函数
var p1 = new Point(2,3);
var p2 = new Point(3,2);
p1.__proto__.printName = function () { 
return 'Oops';
};
p1.printName() // "Oops"
p2.printName() // "Oops"
var p3 = new Point(4,2);
p3.printName() // "Oops"

其他知识点

  1. 不存在变量提升
  2. 可以使用class表达式
  3. 类和模块的内部,默认都是严格模式
  4. 类的name属性总是返回class后面的类名

2.继承

  1. 由于子类没有自己的this对象,因此子类的contstuctor内必须调用super方法,否则报错
  2. 如果子类没有定义constructor,会自动添加
  3. Class同时拥有prototype__proto__属性
  4. 子类的__proto__属性,表示构造函数的继承,总是指向父类
  5. 子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。
  6. 只要是有prototype属性的函数都能被继承,除了Function.prototype
class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }
  toString() {
  return this.color + ' ' + super.toString();
  // 调用父类的toString()
  }}

ES5的继承,实际是想创造子类的实例对象this,然后将父类的方法绑定子类的this(Parent.apply(this));ES6则不同,实质是先创造父类的实例对象(所以要先调用super()),然后子类的构造函数再修改this。

继承目标

3种特殊情况

第一种,子类继承Object

class A extend Object{
}
A.__proto__ = Object;
A.prototype.__proto__ = Object.prototype;

这种情况A相当于Object的复制,A的实例就是Object的实例。

第二种 不存在任何继承

Class A{}
A.__proto__ = Function.prototype;
A.prototype.__proto__ = Object.prototype;

A作为一个基本对象,那么直接继承自Function,但由于new一个A后返回的是一个空对象,因此A的对象继承自Object.prototype.

第三种 子类继承null

class A extend null{}
A.__proto__ = Function.prototype;
A.prototype.__proto = undefined;

因为new一个A后的实例,不继承任何方法,因此为undefined。

super

  1. super作为函数调用时,super指父类构造函数
  2. super作为对象调用时,super代表父类,可以调用父类实例的方法属性以及静态方法

子类的__proto__

  1. 子类实例的__proto__不等于父类实例的__proto__
  2. 子类实例__proto____proto__是父类实例的__proto__
  3. 也就是说子类原型的原型是父类的原型。
  4. 因此子类实例可以通过该方法修改父类实例方法。

继承原生构造函数

可以通过继承原生构造函数,如Array,从而获得Array所有属性和方法,并且可以扩充而不会影响Array的实例。

Class的get和set

class CustomHTMLElement {
  constructor(element) {
    this.element = element;
  }

  get html() {
    return this.element.innerHTML;
  }

  set html(value) {
    this.element.innerHTML = value;
  }
}

var descriptor = Object.getOwnPropertyDescriptor(
  CustomHTMLElement.prototype, "html");
"get" in descriptor  // true
"set" in descriptor  // true
  1. 当对html属性进行读取和设置值时,get和set修饰符会进行拦截。
  2. get和set函数是设置在属性的descriptor上的。

Class的静态方法

  1. 可以直接通过Class调用静态方法,并且不能通过实例调用
  2. 父类静态方法可以被子类继承,子类可以通过自身调用父类静态方法,或者通过super调用

Class的静态属性和实例属性

静态属性是指定义在class本事的属性,而不是对象this属性。

class Foo {
}

Foo.prop = 1;
Foo.prop // 1

因为ES6规定,class内部只有静态方法,没有静态属性,所以只能这么写。


以下为ES7提案,被babel支持。

实例属性

class MyClass {
  myProp = 42;

  constructor() {
    console.log(this.myProp); // 42
  }
}

不用定义在constructor里。

静态属性

class MyClass {
  static myStaticProp = 42;

  constructor() {
    console.log(MyClass.myProp); // 42
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • class的基本用法 概述 JavaScript语言的传统方法是通过构造函数,定义并生成新对象。下面是一个例子: ...
    呼呼哥阅读 4,068评论 3 11
  • 基本写法 ES6的class语法基本上就是基于以前ES5构造函数的包装函数,也可以叫做语法糖,所有的功能都能用ES...
    芒僧阅读 310评论 0 2
  • (一) 有人给我留言,告诉我文章该如何如何写,我觉得建议挺不错的,顿时对Ta,或者说Ta的文章产生了好奇。 我让对...
    剽悍一只猫阅读 4,725评论 53 186
  • 哈哈哈
    136小明阅读 136评论 0 1
  • 等你想找个男朋友的时候告诉我 不要让我等太久 我怕我等到的不是你 你傻傻的笑着 你没有当真 但是你笑了,那也就够了
    Awkward丶祭司阅读 119评论 0 0