arale-class

提供简洁的 OO 实现。

Usage no npm install needed!

<script type="module">
  import araleClass from 'https://cdn.skypack.dev/arale-class';
</script>

README

Class


spm package Build Status Coverage Status

提供简洁的 OO 实现。


使用说明

create Class.create([parent], [properties])

创建一个新类。参数 parent 是继承的父类,properties 是要混入的实例属性。

来看一个简单的例子(线上演示):

/* pig.js */
define(function(require, exports, module) {
    var Class = require('class');

    var Pig = Class.create({
        initialize: function(name) {
            this.name = name;
        },

        talk: function() {
            alert('我是' + this.name);
        }
    });

    module.exports = Pig;
});

initialize 属性,标明初始化方法,会在构建实例时调用。

使用 create 方法创建的类,拥有 extend 方法,可以继续创建子类:

/* red-pig.js */
define(function(require, exports, module) {
    var Pig = require('./pig');

    var RedPig = Pig.extend({
        initialize: function(name) {
            RedPig.superclass.initialize.call(this, name);
        },

        color: '红色'
    });

    module.exports = RedPig;
});

注意:需要在子类方法中,调用父类中的同名方法时,JavaScript 语言自身并没有提供类似 super 的方式来轻松实现。用 createextend 方法创建类时,可以使用 superclass.methodName 来显式调用父类方法。之所以不提供 super 方法,原因有二:

  1. 实现起来较麻烦。现有类库的实现方案,都不完美。
  2. 在 JavaScript 编程中,调用 super 的需求并不多。简单通过 superclass.methodName 来调用已经能够满足需求,并很灵活、清晰。

properties 参数中,除了支持用 initialize 来标明初始化方法,还可以用 Implements 来标明所创建的类需要从哪些类中混入属性:

/* flyable.js */
define(function(require, exports, module) {
    exports.fly = function() {
        alert('我飞起来了');
    };
});
/* flyable-red-pig.js */
define(function(require, exports, module) {
    var RedPig = require('./red-pig');
    var Flyable = require('./flyable');

    var FlyableRedPig = RedPig.extend({
        Implements: Flyable,

        initialize: function(name) {
            FlyableRedPig.superclass.initialize.call(this, name);
        }
    });

    module.exports = FlyableRedPig;
});

注意Implements 采用首字母大写,是因为小写的 implements 是 JavaScript 保留字。大写也表示其特殊性,与 MooTools 的方式一致。

除了 Implements, 还有一个特殊属性:

  • Extends - 用来指定继承的父类,注意只能有一个父类,不支持多继承。

implement SomeClass.implement(properties)

该方法与 Implements 属性的功能类似。当某个类已存在,需要动态修改时,用 implement 方法更便捷。

/* flyable-red-pig-extension.js */
define(function(require, exports, module) {
    var FlyableRedPig = require('./flyable-red-pig');

    FlyableRedPig.implement({
       swim: function() {
           alert('我还会游泳');
       }
    });
});

这样,我们得到了会说话、会飞、还会游泳的飞天红猪侠:

/* test.js */
define(function(require, exports, module) {
    var FlyableRedPig = require('./flyable-red-pig');
    require('./flyable-red-pig-extension');

    var pig = new FlyableRedPig('飞天红猪侠');
    pig.talk(); // alerts '我是飞天红猪侠'
    pig.fly();  // alerts '我飞起来了'
    pig.swim(); // alerts '我还会游泳'
});

extend SomeClass.extend(properties)

Class.create 创建的类,自动具有 extend 方法,功能与 Class.create 完全一样,只是继承的父类是 SomeClass 自身,前面的例子中已说明,不赘述。

Class Class(fn)

将已经存在的 function 函数转换为 Class 类:

function Animal() {
}
Animal.prototype.talk = function() {};

var Dog = Class(Animal).extend({
    swim: function() {}
});

性能对比