在es6
中,新增了class
关键字用于定义一个类,然则本质上并没有给javascript
增添新的oop机制
,由于javascript
原型继续以及组织函数式声明使人觉得艰涩难明,增加class
的目标就是为了掩饰它底层的机制,使得我们不必直接打仗这些观点,相当于一个语法糖。
class语法
在chrome
中运转以下代码
class Super{
constructor(){
this.name = "Super";
}
superSayHello(){
console.log("super hello")
}
}
class Sub extends Super{
constructor(){
super();
this.realName = "Sub";
}
subSayHello(){
console.log("sub hello")
}
}
var sub = new Sub();
调试视察sub
的值。
我们发明统统的要领都是定义在对象的prototype
属性上,不难得出这几者的关联如下图所示
es5语法
es6
中的class
与我们之前写的原型继续基础一致,一样的关联用es5
来写的话
function Super(){
this.name= "Super";
}
Super.prototype.superSayHello = function(){
console.log("super hello")
};
function Sub(){
//借用父类组织函数 等价于es6中的super()
Super.call(this);
this.realName= "Sub";
}
//以上只完成了数据的复制
//运用Object.create() 而不是new Sub(); 防止挪用两次Sub();
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
var sub = new Sub();
扩大
由于javascript
本质上是没有类这个观点,统统皆对象,为了模仿别的面向对象言语的特征(如JAVA
),涌现了许多种间接完成继续的要领。以上es5
的继续实在就是我们说的寄生式组合继续,也是javascript
中最经常使用的继续形式。