javascript继承框架

javascript inheritance framework

本文关键字:框架 继承 javascript      更新时间:2023-09-26

是否有一个小型、轻量级的javascript类继承解决方案,在客户端和服务器端(node.js)都能很好地工作?我不想要一个大的库,只想要一个允许我声明构造函数和一些方法的库,然后让类能够继承它。

John Resig在这里用大约25行代码概述了一个简单的继承框架。我看到它过去效果很好。

你可以这样使用它:

var Vehicle = Class.extend({
  init: function(wheels) {
    this.wheels = wheels;
  }
});
var Truck = Vehicle.extend({
  init: function(hp, wheels) {
    this.horsepower = hp;
    this._super(wheels);
  },
  printInfo: function() {
    console.log('I am a truck and I have ' + this.horsepower + ' hp.');
  }
});
var t = new Truck(4, 350);
t.printInfo();

看看https://github.com/ded/klass

我创建这个小库是为了使用ExtJs样式ClassManager。它还很简单,但非常灵活。

通过node.js安装

npm install esf-core

样本

Esf.define('A', {
    a: null,
    constructor: function (a) {
        // Save var
        this.a = a;
        // Heyho
        console.log('A');
    },
    foo: function (b) {
        console.log('foo - ' + b);
    }
});
Esf.define('B', {
    b: null,
    constructor: function (a, b) {
        // Call super constructor
        this.callParent(a);
        // Save var
        this.b = b;
        // Heyho
        console.log('B');
    },
    foo: function () {
        this.callParent('bar');
    }
}, {
    extend: 'A'
});
// Use
var b = new B(1, 2);
// or
var b = Esf.create('B', 1, 2);
/*
 * Output:
 * A
 * B
 * foo - bar
 */
b.foo();

存储库

https://bitbucket.org/tehrengruber/esf-js-core

我已经成功地使用了原型库。

我认为这比简单继承fw:中的init hax要好得多

(function() {
    var core = {
        require : function(source) {
            if ( typeof (source) != "object" || !source)
                throw new TypeError("Object needed as source.");
            for (var property in source)
                if (source.hasOwnProperty(property) && !this.prototype.hasOwnProperty(property))
                    this.prototype[property] = source[property];
        },
        override : function(source) {
            if ( typeof (source) != "object" || !source)
                throw new TypeError("Object needed as source.");
            for (var property in source)
                if (source.hasOwnProperty(property))
                    this.prototype[property] = source[property];
        },
        extend : function(source) {
            var superClass = this;
            var newClass = source.hasOwnProperty("constructor") ? source.constructor : function() {
                superClass.apply(this, arguments);
            };
            newClass.superClass = superClass;
            var superClone = function() {
            };
            superClone.prototype = superClass.prototype;
            newClass.prototype = new superClone();
            newClass.prototype.constructor = newClass;
            if (source)
                newClass.override(source);
            return newClass;
        }
    };
    core.require.call(Function, core);
    Function.create = function (source){
        var newClass = source.hasOwnProperty("constructor") ? source.constructor : function() {};
        newClass.override(source);
        return newClass;
    };
})(); 

车辆示例:

var Vehicle = Function.create({
    constructor : function(wheels) {
        this.wheels = wheels;
    }
});
var Truck = Vehicle.extend({
    constructor : function(hp, wheels) {
        this.horsepower = hp;
        Vehicle.call(this, wheels);
    },
    printInfo : function() {
        console.log('I am a truck and I have ' + this.horsepower + ' hp.');
    }
});
var t = new Truck(4, 350);
t.printInfo();

我创建了一个非常轻量级的库,可以在浏览器和node.js中使用

  • https://github.com/fresheneesz/proto

示例:

var Person = proto(function() {       // prototype builder
    this.init = function(legs, arms) {      // constructor
        this.legs = legs
        this.arms = arms
    }
    this.getCaughtInBearTrap = function() { // instance method
        this.legs -= 1
    }
    this.limbs = function() {
        return this.arms + this.legs
    }
})
var Girl = proto(Person, function() { // inheritance
    this.haveBaby = function() {
        return Person(2,2)
    }
})
var g = Girl(2,2)        // instantiation
g.getCaughtInBearTrap()
console.log("Girl has "+g.limbs()+" limbs")
console.log(": (")