aralejs / class

Class Utility
aralejs.org/class
102 stars 88 forks source link

读了下2.0.0,和自己一直用的Class做了下比较 #15

Open army8735 opened 10 years ago

army8735 commented 10 years ago

2.0的确精简了很多,也较为易读了。 更新了原有的jsPerf,加了2.0的性能测试,同时添加了我自己的AClass。 http://jsperf.com/class-perfs/11 chrome有时刷不出来图,FF可以,真奇特。

arale的API都知道,不多说,说说我的:

var Animal = AClass(function(name) {
  this.name = name;
}).methods({
  talk: function() {
    return 'I am ' + this.name;
  }
});
var Bird = Animal.extend(function(name) {
  Animal.call(this, name);
}).methods({
  fly: function() {
    return 'I am flying';
  }
});

比较而言:

暂时这些想法,贴下我的源码,可以精简掉static:

define('Class', function() {
    function inheritPrototype(subType, superType) {
        var prototype = Object.create(superType.prototype);
        prototype.constructor = subType;
        subType.prototype = prototype;
        //继承static变量
        Object.keys(superType).forEach(function(k) {
            subType[k] = superType[k];
        });
        return subType;
    }
    function wrap(fn) {
        fn.extend = function(sub) {
            inheritPrototype(sub, fn);
            return wrap(sub);
        }
        fn.methods = function(o) {
            Object.keys(o).forEach(function(k) {
                fn.prototype[k] = o[k];
            });
            return fn;
        };
        fn.statics = function(o) {
            Object.keys(o).forEach(function(k) {
                fn[k] = o[k];
            });
            return fn;
        };
        return fn;
    }
    function klass(cons) {
        return wrap(cons || function() {});
    }
    klass.extend = inheritPrototype;
    return klass;
});

提供之前的思路吧,或许对师兄姐们有所帮助~ 最后,期待下ES6的class,然后希望能寻找到一种安全等价无需额外附加的转换方法~目前我想到的要加个superClass才行(因为有super方法)。

class Father() {
  constructor(a) {
    this.a = a;
  }
  method() {
    return this.a;
  }
}
class Child() {
  constructor(a) {
    super(a);
  }
  method() {
    return super.method();
  }
}