JavaScript的ES6——Class基本语法
-
JavaScript 语言中,生成实例对象的传统方法是通过构造函数。
function Sum(a, b) { this.a = a; this.b = b; } Sum.prototype.sum = function() { console.log(this) return this.a + this.b; } let one = new Sum(1, 2); console.log(one.sum());
这种写法跟传统的面向对象语言差异很大,很容易让新学习这门语言的程序员感到困惑,不是一般的困惑…… -
所以ES6 提供了Class关键字,通过
class
关键字,可以用于定义类:class Phone{}
而原来ES5中的构造函数也改为了
constructor
方法,this
关键字则代表实例对象:class Sum { constructor(a, b) { this.a = a; this.b = b; } sum() { console.log(this); return this.a + this.b; } } let p = new Sum(1, 2); console.log(p.sum());
定义“类”的方法的时候,前面不需要加上
function
这个关键字,直接把函数定义放进去了就可以了。构造函数的
prototype
属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype
属性上面。在类的实例上面调用方法,其实就是调用原型上的方法。
class B {} let b = new B(); console.log(b.constructor === B.prototype.constructor);//true
-
constructor
方法是类的默认方法,通过new
命令生成对象实例时,自动调用该方法。 -
ES6 与 ES5 一样,也是使用
new
命令实例化对象,不过 ES5 使用的是构造函数,在不加new时会当做函数执行,而ES6则会直接报错。 -
静态方法,类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上
static
关键字,就表示该方法不会被实例继承,而是直接通过类来调用。class Phone { static wholesale() { console.log('批发'); } } Phone.wholesale(); let p = new Phone(); p.wholesale();
-
Class 的继承:Class 通过
extends
关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。class ParClass {} class SonClass extends ParClass { constructor(emm) { super(); this.emm = emm; } } let p = new SonClass('我叫参数');
子类必须在
constructor
方法中调用super
方法,否则新建实例时会报错;super
关键字表示父类的构造函数,用来新建父类的this
对象。如果子类没有定义
constructor
方法,这个方法也会被默认添加。 -
类的
prototype
属性和__proto__
属性:大多数浏览器的 ES5 实现之中,每一个对象都有
__proto__
属性,指向对应的构造函数的prototype
属性。Class 作为构造函数的语法糖,同时有prototype
属性和__proto__
属性,因此同时存在两条继承链。(1)子类的
__proto__
属性,表示构造函数的继承,总是指向父类。(2)子类
prototype
属性的__proto__
属性,表示方法的继承,总是指向父类的prototype
属性。