ES6 class

ES6中Class可以通过extends实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。

calss Point{
}
class ColorPoint extends Point{
}
//上面代码定义了一个ColorPoint类,该类通过extends关键字,继承了Point类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于赋值了一个Point类。下面,我们在Colorpoint内部加上代码。
class ColorPoint extends Point{
	constructor(x,y,color){
		super(x,y);//调用父类的constructor(x,y)
		this.color = color;
	}
	toString(){
		return this.color + ' '+ super.toString()  //调用父类的toString()
	}
}
//上面代码中,constructor方法和toSrting方法中,都出现了super关键字,他在这里表示父类的构造函数,用来新建父类的this对象。
//子类必须在constuctor方法中调用super方法,否则新建实例时则会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后在对其进行加工,加上子类自的实例属性和方法。如果不调用super方法,子类就的不到this对象。
class Point {/**/}
class ColorPoint extends Point{
	constructor(){
	}
}
let cp = new ColorPoint(); // ReferenceError
//上面代码中,ColorPoint继承了父类Point,但是它的构造函数没有调用super方法,导致新建实例时报错。
ES5的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent。apply(this))。ES6的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先盗用super方法),然后再用子类的构造函数修改this。
如果子类没有定义constructor方法,这个方法会被默认添加,代码如下。也就是说,不管有没有显式定义,任何一个子类constructor方法。
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; // 正确
	}
}
// 上面代码中,子类的constructor方法没有调用super之前,就使用this关键字,结果报错,而放在super方法之后就是正确的。
下面是生成子类实例的代码。
let  cp  = new ColorPoint(25,8,'green');

cp instanceof ColorPoint //true
cp instanceof Point //true
//上面代码中,实例对象cp同时是ColorPoint和Point两个类的实例,这与ES5的行为完全一致。
最后,父类的静态方法,也会被子类继承。
class A{
	static hello(){
		console.log('hello world');
	}
}
class B extends A{
}
B.hello()  //hello world 
上面代码中,hello()是A类的静态方法,B继承A,也继承了A的静态方法。

2.Object.getPrototypeOf()
Object.getPrototypeOf方法可以用来从子类上获取父类。

Object.getPrototopeOf(colorPoint) === Point  //true

因此,可以使用这个方法判断,一个类是否继承了另一个类。
3.super关键字
super这个关键字,既可以当做函数使用,也可以当做对象使用。在这两种情况下,它的用法完全不同。
第一种情况,super作为函数调用时,代表父类的狗仔函数ES6要求,子类的构造函数必须执行一次super函数。

class A{}
class B extends A{
	constructor(){
		super();
	}
}
上面代码中子类B的构造函数中的super(),代表调用父类的构造函数。这是必须的,否则javascript引擎会报错。
注意,super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this是指的是B的实例,因此super()在这里相当于
A.prototype.constructor.call(this)。
class A{
	constructor(){
		console.log(new.target.name);
	}
}
class B extends A{
	constructor(){
		super();
	}
}
new A() // A
new B() // B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值