jQueryでPrototype.js風のクラスを使う

Prototype.js 風の Class を書きたいが、ライブラリ全体は読み込みたくない、というときのために、必要最低限のコードを抜き出してみた。要jQuery。

var Class = (function() {
        function subclass() {}
        return {
        create: function(parent) {
                function klass() {
                    this.initialize.apply(this, arguments);
                }
 
                var index = 0;
                if(jQuery.isFunction(parent)) {
                    index = 1;
                    subclass.prototype = parent.prototype;
                    klass.prototype = new subclass;
                }
                for(; index < arguments.length; ++index) {
                    jQuery.extend(klass.prototype, arguments[index]);
                }
                return klass;
            }
        }
    })();

最大の違いは $super による親クラスのメソッド呼び出しができないこと。Prototype.jsのチュートリアルの例は次のようになる。

var Person = Class.create({
  initialize: function(name) {
    this.name = name;
  },
  say: function(message) {
    return this.name + ': ' + message;
  }
});
 
var Pirate = Class.create(Person, {
  say: function(message) {
    //親クラスのprototypeに直接アクセス
    return Person.prototype.say.call(this, message) + ', yarr!';
  }
});
 
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"

mix-in の例などはそのまま動く。

Leave a Reply