ES6Class模拟实现

引言

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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值