というわけで修正版。
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を隠蔽できていないことのような気もする。
since 2004/08/30
Copyright (C) Tom ALL Rights Reserved
当サイト内に掲載されている画像、情報等の無断複製は禁止します。