【ES6新增】class类

JavaScript中,生成实例对象的传统方法是通过构造函数,ES6为了更接近传统语言的写法,引入了Class类这个概念,作为对象的模板,通过class关键字,可以定义类
定义类的方法时,前面不需要加上function关键字,直接把函数定义放进去就可以了,且方法之间不需要用逗号分隔

class Point{
	...
}
typeof Point //function
Point===Point.prototype.constructor	//true
  • 类的数据类型就是函数,类本身就指向构造函数
  • 使用的时候也是直接对类进行new命令,跟构造函数的用法一致
  • 类的所有方法都在构造函数的prototype属性上
class Point{
	constructor(){
	...
	}
	toString(){
	...
	}
	toValue(){
	...
	}
}
//等同于
 Point.prototype={
	constructor(){}
	toString(){}
	toValue(){}
};
  • 在类的实例上面调用方法,实际上就是调用原型上的方法
class B{}
let b=new B()
b.constructor===B.prototype.constructor //true
  • Object.assign 方法可以很方便地一次向类添加多个方法。
Object.assign(Point.prototype,{
	toString(){}
	toValue(){}
})

补充:

  • Object.keys(obj) 返回一个由给定对象obj自身可枚举属性组成的数组,数组中属性名的排列顺序和正常遍历该对象时返回的顺序一致。
  • Object.getOwnPropertyNames()方法 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

  • 类内部所有定义的方法,都是不可枚举的,这一点与ES5行为不一致

ES6不可枚举

class Point {
  constructor(x, y) {
    // ...
  }
  toString() {
    // ...
  }
}
Object.keys(Point.prototype)
// []
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]

ES5可枚举

var Point = function (x, y) {
  // ...
};
Point.prototype.toString = function() {
  // ...
};
Object.keys(Point.prototype)
// ["toString"]
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]
  • constructor 方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法。一个类必须有 constructor 方法,如果没有显式定义,一个空的 constructor 方法会被默认添加。
  • 类必须使用 new 调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用 new 也可以执行。
  • 与 ES5 一样,实例的属性除非显式定义在其本身(即定义在 this 对象上),否则都是定义在原型上(即定义在 class 上)。
  • 与 ES5 一样,类的所有实例共享一个原型对象。
var p1 = new Point(2,3);
var p2 = new Point(3,2);
p1.__proto__ === p2.__proto__
//true
  • 不存在变量提升,必须保证子类在父类之后定义

这样会报错

new Foo(); // ReferenceError
class Foo {}
{
  let Foo = class {};
  class Bar extends Foo {
  }
}

上面的代码不会报错,因为 Bar 继承 Foo 的时候, Foo 已经有定义了。但是,如果存在 class 的提升,上面代码就会报错,因为 class 会被提升到代码头部,而 let 命令是不提升的,所以导致 Bar 继承 Foo 的时候, Foo 还没有定义。

  • name属性
class Point {}
Point.name // "Point"

name 属性总是返回紧跟在 class 关键字后面的类名。

  • Generator 方法
    如果某个方法之前加上星号( * ),就表示该方法是一个 Generator 函数。
  • this的指向
    类的方法内部如果含有 this ,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。

类的继承

  • class可以通过extends实现继承
  • Object.getPrototypeOf 方法可以用来从子类上获取父类。
    Object.getPrototypeOf(ColorPoint) === Point // true
    因此,可以使用这个方法判断,一个类是否继承了另一个类。
  • super关键字
    super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。
  1. 第一种情况, super 作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次 super 函数。
  2. 第二种情况, super 作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。
    作为一个对象,子类( B )的原型( proto 属性)是父类( A );作为一个构造函数,子类( B )的原型对象( prototype 属性)是父类的原型对象( prototype 属性)的实例。
class A {
}
class B extends A {
}
B.__proto__ === A // true
B.prototype.__proto__ === A.prototype // true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值