JS类的实现

1个月前写过最简单的那种,再重新实现一遍

//类的实现,一个参数创建类,两个参数继承类
var Klass = function (parent, options) {
    var
        hasOwn = Object.prototype.hasOwnProperty,
        isFunc = function(obj) {
            return typeof obj === 'function';
        },
    //中间函数避免执行父类构造函数
        Func = function () {
        },//返回的子类
        Child = function () {
            isFunc(this.initialize) && this.initialize.apply(this, arguments);
        },
        k;

    //参数check
    if (arguments.length === 0 || arguments.length > 2) throw new Error("只接受1个或2个参数");
    //只传入一个参数对象
    if (!isFunc(parent)) {
        options = parent;
        parent = null;
    }
    //继承父类
    if (parent) {
        Func.prototype = parent.prototype;
        Child.prototype = new Func();
        Child.superproto = parent.prototype;
        Child.prototype.constructor = Child;
    }
    //添加options
    for (k in options) {
        if(hasOwn.call(options, k)) Child.prototype[k] = options[k];
    }

    return Child;
};

//测试
var Person = Klass({
        initialize: function(opt) {
            this.name = 'unnamed';
            $.extend(this, opt);
        },
        getName: function () {
            return this.name;
        },
        say: function() {
            console.log("hello world");
        }
    }),
    Player = Klass(Person, {
        play: function () {
            console.log("i'm playing " + this.game);
        }
    }),
player1
= new Player({ name: 'bobo', game: 'Dota2' }); player1.play(); // "i'm playing Dota2" player1.say(); // "hello world" console.log(player1.getName()); // "bobo"
原文地址:https://www.cnblogs.com/coiorz/p/4817087.html