引言
Class特点
1.class必须以new的方式执行直接执行会报错
2.class原型属性、静态属性也不可枚举
3.继承: 公有属性、私有属性
私有属性不等同于静态属性:私有属性可以被实例化的对象继并且每一个对象都不同,静态属性只是构造函数所有
私有属性访问:var op = new Plane(); op.private(私有属性名); 静态属性访问:Plane.static(静态属性名)
function _classCallCheck(_this, _constructor){ // 监测是否以new的方式执行
// 在new的同时构造函数内部会发生:this对象内有一个_proto_属性指向构造函数(这里是Plane)的prototype
if(!(_this instanceof _constructor)){ // 判断this的原型链上有没有_constructor的原型
throw "TypeError:Class constructor Plane cannot be invoked without 'new'";
}
}
function _definedProperties(target, props){ // 属性设置
props.forEach(function (ele){
// 不配置枚举属性默认为false
Object.defineProperty(target, ele.key, {
value:ele.value,
writable: true, // 可写
configurable: true // 可配置
})
})
}
function _createClass(_constructor, _prototypePropeties, _staticProperties){
if(_prototypePropeties){ // 原型属性
_definedProperties(_constructor.prototype, _prototypePropeties)
}
if(_staticProperties){ // 静态属性
_definedProperties(_constructor, _staticProperties)
}
}
var Plane = (function (){ // es6中class源码就是用立即执行函数写的:优点可以私有化变量防止变量污染
function Plane(name){
// 判断是否以new的方式执行
_classCallCheck(this, Plane)
// 私有属性
this.name = name || '';
this.blood = 100;
}
_createClass(Plane, [{
key:'fly',
value: function (){
console.log('fly')
}
}],[{
key:'alive',
value: function (){
return true;
}
}])
return Plane;
})();
var myPlane = new Plane('steven的飞机');
function _inherit(o, p){
// Object.setPrototypeOf 内部执行了 o.prototype._proto_ = p.prototype
Object.setPrototypeOf(o.prototype, p.prototype);
}
var AttackPlane = (function (Plane){
_inherit(AttackPlane, Plane);// 公有属性继承
function AttackPlane(name){
_classCallCheck(this, AttackPlane)
this.logo = '战斗机';
Plane.call(this, name); // 私有属性继承
}
_createClass(AttackPlane, [{
key:'attack',
value: function (){
console.log('duang~duang~duang~')
}
}],[{
key:'alive',
value: function (){
return true;
}
}])
return AttackPlane;
})(Plane)
console.log(new AttackPlane('1').attack());// 原型属性-公有属性 : duang~duang~duang~
console.log(new AttackPlane('1').fly());// 继承的公有属性: fly
console.log(AttackPlane.alive());// 静态属性:true
console.log(new AttackPlane);// 私有属性+继承的私有属性 :AttackPlane { logo: '战斗机', name: '', blood: 100 }