在 ES2015/ES6 中引入了class关键字,但只是语法糖,JavaScript 仍然是基于原型的
当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为 __ proto __ )指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象( __ proto __ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
一下是function
和class
的几点不同
-
class
没有变量提升,必须先声明后使用 -
class
不能重复定义,会报语法错误 -
class
定义的类没有私有方法和私有属性 -
class
静态方法与静态属性
class
定义的静态方法前加static关键字- 只能通过类名调用
- 不能通过实例调用
- 可与实例方法重名
- 静态方法中的
this
指向类而非实例- 静态方法可被继承
- 在子类中可通过
super
方法调用父类的静态方法
下面是babel
对类的实现
var _createClass = function(){
function defineProperties(target, props){
for(vari =0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps){
if(protoProps) defineProperties(Constructor.prototype, protoProps);
if(staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();