自己动手,实现javascript类型定义:Class

javascript发展至今,大多数浏览器已支持ES2015标准的class类型定义语法:

"use strict";//要求严格模式

class name [extends] {
  constructor:...
  prop1:...
  method1:...
}

//或者:

const name = class [className] [extends] {
  ...
}

在不支持class类型的浏览器中,或者为了兼容非严格模式下已在使用的功能,自己动手制作一个定义类、继承类的功能(支持IE9以上及其他各类主流浏览器),可继承传统方式定义的类型,也可继承系统预定义类型:

资源链接:CSDN下载:Javascript编程 类的继承及封装:Class

使用示例:

一、定义基类及继承:

    var A = Class({  //基类
        constructor: function (a) {  //构造函数,可无
            this.a = a;
        },
        add: function (n) {  //定义方法及属性
            this.a += n;
        },
        dec: function (n) {  //定义方法及属性
            this.a -= n;
        }
    });

    var B = Class({  //继承
        extends: A,  //继承自
        constructor: function (a) {
            this.super(a * a);   //调用基类的构造函数
        },
        add: function (n) {  //重载方法
            A.prototype.add.call(this, n * n);  //调用被重载的基类方法
        }
    });

//测试及结果:
    var b = new B(2);
    b.add(2);   //调用重载的方法
    b.dec(2);   //调用继承自基类的方法
    console.log(b);   //{a: 6}
    console.log(b instanceof A);    //true

二、继承传统方式定义的类型:

    function A(a) {  //传统方式定义类型
        this.a = a;
    }
    A.prototype.add = function (n) {  //方法
        this.a += n;
    }
    A.prototype.dec = function (n) {
        this.a -= n;
    }

    var B = Class({  //继承
        ...(以下同“一、定义基类及继承”中的代码)

三、继承系统预定义类型,以Array举例:

    var C = Class({
        extends: Array,  //继承系统预定义类
        constructor: function () {
            var a = Array.apply(this, arguments);//此为兼容IE9,其他浏览器也可改为:Array(...arguments)
            for (var i = 0; i < a.length; i++) this.push(a[i]);//原因同上:a.forEach(it=>this.push(it))
        },
        push: function (v) {
            Array.prototype.push.call(this, "@" + v);
        },
    });

//测试及结果:
    var c = new C("A", "B");
    c.push("C");
    console.log(c);     //['@A', '@B', '@C']
    console.log(c instanceof Array); //true
    console.log(c instanceof C);     //true

  通过以上代码及使用示例,可以看到在javascript中定义及继承类已非常地简单。同时,在此基础上,您也可以轻易扩展其能力。

  比如,通过将代码中的assign函数做以下修改:

    function assign(s, t) {
        Object.getOwnPropertyNames(s).forEach(function (p) {
            if (p !== 'extends' && p !== 'constructor') {
                var isDesc = typeof s[p] === "object";
                //一般类型定义中不要使用对象(包括数组)作为属性,否则会出现共享冲突。
                //所以这里使用“typeof... === "object"”做简单判断
                Object.defineProperty(t, p, isDesc ? s[p] : Object.getOwnPropertyDescriptor(s, p));
            }
        });
    }

  我们就可以在定义属性时,直接使用Object.defineProperty定义属性时的get、set、writable等能力。

  示例:

    var A = Class({
        constructor: function (a) {
            this.a = a;
        },
        b:{
            get: function(){
                return "result: "+this.a;
            }
        }
    });
//测试及结果:
    var a = new A(2);
    console.log(a);   //{a: 2, b: "result: 2"}

  结语:javascript作为一门浏览器语言,是有不可替代的使用价值及研究价值的。在追求模块化、对象化编程的今天,javascript是可以胜任的。作者积累多年的前后端开发经验,愿与您一起研究和分享。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值