Kazuho@Cybozu���ޡ����Ĥ⤢�꤬�Ȥ��������ޤ���

Kazuho@Cybozu Labs: JavaScript �� String ����Ѿ�����
��������������ȡ�String ����Ѿ��äݤ����Ȥ��Ǥ��ޤ�������ʴ�����

���������ץ��ȥ�����Ū�Ѿ���ǥ�δ����Ǥ�����ޤ�����

Atomic��Object��Ѿ�

����ϡ��ʲ��Τ褦�����Ū�˽���ޤ���

var Atomic = function(C){
    var P = function(v){ this._v = v; };
    P.prototype = new C;
    P.prototype.valueOf  = function(){ return this._v.valueOf(); }
    P.prototype.toString = function(){ return this._v.toString(); }
    return P;
}

�Ȥ��Ȥ��Ϥ���ʡ�

var MyStr = Atomic(Str);
MyStr.prototype.x = function(n){
  var str = '';
  while (n--) str += this;
  return new MyStr(str);
};
var mystr = new MyStr("foobar");

�����������ΤޤޤǤ�Atomic�ʾ��Ȥ����Ǥʤ�����ʬ���ʤ���Фʤ�ޤ���

object()�γ�ĥ

�����ǡ�object()��ʲ��Τ褦�˳�ĥ���ޤ���

var object = function(obj, base) {
    var P;
    switch ( typeof(obj) ) {
    case "boolean":
    case "number":
    case "string":
        P = Atomic((base || obj).constructor);
        break;
    // case "array": typedof([]) is "object".
    case "object":
        P = function(){};
        P.prototype = (base || obj);
        break;
    default:
        return;
    };
    P.prototype.method = function(o, f){
        if (typeof(o) == "string"){
            P.prototype[o] = f;
        }else{
            for (var p in o){
                P.prototype[p] = o[p];
            }
        }
    }
    return new P(obj);
}

����ǡ��ɤ��Object���Ф��Ƥ⡢obj.method()��Ȥäƥ᥽�åɤ��ɲäǤ��ޤ���

var mystr = object("foobar");
mystr.method('x', function(n){
  var str = '';
  while (n--) str += this;
  return new MyStr(str);
});

�����������ΤޤޤǤ�Singleton Method���ɲä�������ʤ����Ȥˤʤ�ޤ�����Ϥ��硹Ū�˻Ȥ��ˤ�

var MyStr = function(o){
  // constructor �����
}
var mystr = new MyStr("foobar");
var double = mystr.x(2);

�Τ褦�ˤ������Ȥ����Ǥ���

Fake Constructor�����

����MyStr()�������ɤ�����Ф褤�Ǥ��礦������������Ф褤�ΤǤ���

var MyStr = function(o){
    var self = object(o);
    self.method({
        'x': function(n){
            var str = '';
            while (n--) str += this;
            return new MyStr(str);
        },
        /* ¾��method�⤳������� */
    });
    return self;    
}

���������ܤ���ĺ�������Τϡ�MyStr()��this�ˤϥΡ����å��ʤ��ȤǤ���������MyStr.prototype.x = function(){ /*... */ }�Ͻ���ޤ��󡣤���������������self.method()��ô�äƤ��ޤ���

���Ȥϡ�

var mystr = new MyStr("foobar"); // �¤�new�Ϥ��äƤ�ʤ��Ƥ�褤��
var double = mystr.x(2);

�Ȥ���Ф����櫓�Ǥ���

�ǥ�

�ޤȤ��ȡ�����ʴ����ˤʤ�ޤ���

Boolean

Number

String

Array

Object

�ʤ�­�ˤ����äƤʤ��ʤ�ȴ���ʤ��ä��ɤ�ȴ������ʬ�Ǥ���

Enjoy!

Dan the Prototyper