Heaven's Kitchen

(no subject)

というわけで修正版。

var Class = {
    'create': function (proto) {
	var repos = [];

	var Proto = function () {};
	Proto.prototype = proto;

	var klass = function () {
	    this._id = repos.length;
	    repos.push(new Proto);
	    proto.initialize.apply(repos[this._id], arguments);
	};

	for (var i in proto) {
	    if (i == 'initialize') continue;
	    if (typeof proto[i] == 'function') {
		klass.prototype[i] = function (ix) {
		    return function () {
			return proto[ix].apply(repos[this._id], arguments);
		    };
		}(i);
	    }
	}

	klass.extend = function (obj) {
	    for (var i in obj) {
		if (typeof obj[i] == 'function') {
		    klass.prototype[i] = function (ix) {
			return function () {
			    return obj[ix].apply(repos[this._id], arguments);
			};
		    }(i);
		    Proto.prototype[i] = obj[i];
		}
	    }
	};

	return klass;
    }
};

function main() {
    var Foo = Class.create({
	    'initialize' : function (x) {
		this.x = x;
	    },
	    'getX' : function () {
		return this.x;
	    },
	    'setX' : function (x) {
		this.x = x;
	    },
	    'foo' : function () {
		print(this.getX());
	    }
	});

    var foo = new Foo(100);
    print(foo.getX()); // 100
    print(foo.x);      // undefined
    foo.setX(200);
    foo.foo();         // 200
}

window.onload = main;

原因はループ変数のiだったような気がする。

Publicメソッドを内部から呼ぶってこれで合ってるかな…。

ていうかこの方法の一番の問題点は_idを隠蔽できていないことのような気もする。

上記のコメントを削除します。投稿時に指定した削除キーを入力してください。

Valid XHTML 1.0! Valid CSS!