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 の例などはそのまま動く。