+// parent : \8cp\8f³\82µ\82½\82¢\83N\83\89\83X
+// args : \8cp\8f³\8e\9e\82É\90e\83N\83\89\83X\82Ì\83R\83\93\83X\83g\83\89\83N\83^\82É\93n\82µ\82½\82¢\88ø\90\94\82Ì\94z\97ñ
+// protos : (\8fÈ\97ª\89Â) prototype\82Æ\82µ\82Ä\90é\8c¾\82µ\82½\82¢\83I\83u\83W\83F\83N\83g\82ð\8ew\92è
+Function.prototype.extend = function(parent, args, protos)
+{
+ if(!args) args = [];
+
+ // \90e\83N\83\89\83X(obj)\82Ì\83v\83\8d\83g\83^\83C\83v\82ð\8eq\83N\83\89\83X\82Ì\83v\83\8d\83g\83^\83C\83v(p)\82É\93K\97p\82·\82é
+ var applyPrototypeFunc = function(obj, p)
+ {
+ if(obj.base) //obj\82Ì\90e\83N\83\89\83X\82ª\82¢\82é\82©\8am\94F
+ {
+ //\90e\83N\83\89\83X\82ª\82¢\82½\82Ì\82Å\81A\82»\82ê\82ð\90æ\82Ép\82É\93K\97p
+ applyPrototypeFunc(obj.base, p);
+ }
+
+ for(var pp in obj.prototype)
+ {
+ p[pp] = obj.prototype[pp];
+ }
+ };
+
+ // \90e\83N\83\89\83X(obj)\82Ì\83\8d\81[\83J\83\8b\95Ï\90\94\82ð\8eq\83N\83\89\83X(c)\82É\93K\97p
+ var applyValsFunc = function(obj, c, arg)
+ {
+ if(obj.base) //obj\82Ì\90e\83N\83\89\83X\82ª\82¢\82é\82©\8am\94F
+ {
+ //\90e\83N\83\89\83X\82ª\82¢\82½\82Ì\82Å\81A\82»\82ê\82ð\90æ\82Éc\82É\93K\97p
+ applyValsFunc(obj.base, c, obj.baseArgs);
+ }
+
+ // .extend\82Å\8dì\90¬\82·\82é\83N\83\89\83X\82É\82Í sourceFunc\82ª\91¶\8dÝ\82·\82é(\8c©\82©\82¯\82ÌFunction\82Æ\8fo\97Í\82³\82ê\82é\82à\82Ì\82ª\88Ù\82È\82é\82½\82ß)
+ if(obj.sourceFunc)
+ {
+ obj.sourceFunc.apply(c, arg);
+ }else
+ {
+ obj.apply(c, arg);
+ }
+ };
+
+ if(this instanceof Function && parent instanceof Function)
+ {
+ var child = this; // \8eq\83N\83\89\83X\82Ì\8c³\82Ì\92è\8b`(function(){})\82ð\8ew\82·
+ var proto = null; // \83C\83\93\83X\83^\83\93\83X\82Ì__proto__\82É\91ã\93ü\82³\82ê\82é\83v\83\8d\83g\83^\83C\83v
+ var func = function(){ // \8eÀ\8dÛ\82É\95Ô\82³\82ê\82é\8eq\83N\83\89\83X\82Ì\92è\8b`
+
+ //proto\82ª\8dì\82ç\82ê\82Ä\82¢\82È\82©\82Á\82½\82ç(\8cv\8eZ\97Ê\8dí\8c¸\82Ì\82½\82ßproto\82Í\88ê\89ñ\82µ\82©\8dì\82ç\82È\82¢)
+ if(proto === null)
+ {
+ //\82Ü\82¸\8eq\83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X\82Ì__proto__\82Æ\82µ\82Ä\8eg\82í\82ê\82éObject\82Ì\90é\8c¾
+ proto = new Object();
+
+ //prototype\82ð\8dÄ\8bA\93I\82É\93K\97p
+ applyPrototypeFunc(func, proto);
+
+ //JavaScript\82Å\82Í\83C\83\93\83X\83^\83\93\83X\82Ìconstructor\83v\83\8d\83p\83e\83B\82Å\90e\83N\83\89\83X\82Ì\92è\8b`\82ð\8eQ\8fÆ\82Å\82«\82Ü\82·
+ proto.constructor = parent;
+ }
+
+ //\8eq\83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X\82ð\8dì\90¬
+ var tmp = new Function();
+ tmp.prototype = proto;
+ var cl = new tmp();
+
+ /*
+ if(parent.sourceFunc)
+ {
+ cl.constructor = parent.sourceFunc;
+ }else
+ {
+ cl.constructor = parent;
+ }
+ */
+ cl.constructor = func;
+
+ // \90e\83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X\95Ï\90\94\82ð\8am\95Û
+ applyValsFunc(parent, cl, args);
+
+ // \8eq\83N\83\89\83X\82Ì\8c³\82Ì\92è\8b`\82Ì\83C\83\93\83X\83^\83\93\83X\95Ï\90\94\82ð\8am\95Û
+ child.apply(cl, arguments);
+
+ return cl;
+ };
+
+ // \8eÀ\8dÛ\82É\95Ô\82³\82ê\82é\8eq\83N\83\89\83X\82Ì\92è\8b`\82É\83v\83\8d\83g\83^\83C\83v\82ð\92Ç\89Á (\8eq\83C\83\93\83X\83^\83\93\83X\82É\94½\89f\82³\82ê\82é)
+ // \92\8d\88Ó! myClass.prototype = { ... }; \82Ý\82½\82¢\82È\82±\82Æ\82ð\82â\82é\82Æ\93r\92[\82É\8fÁ\82¦\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+ // \82±\82ê\82ç\82ª\8fÁ\82¦\82é\82Æ\90e\83N\83\89\83X\82Ö\82½\82Ç\82é\82±\82Æ\82ª\82Å\82«\82È\82\82È\82è\82Ü\82·\81B
+ //func.prototype.base = parent;
+
+ // \8eq\83N\83\89\83X\82Ì\92è\8b`\8e©\91Ì\82É\83v\83\8d\83p\83e\83B\82ð\92Ç\89Á
+ func.base = parent;
+ func.baseArgs = args;
+ func.sourceFunc = child;
+
+ //protos\82Å\92è\8b`\82³\82ê\82½prototype\82Ì\93K\97p
+ if(protos)
+ {
+ for(var pr in protos)
+ {
+ func.prototype[pr] = protos[pr];
+ }
+ }
+
+ return func;
+
+ }else
+ {
+ throw new TypeError("'extend' can be used only to a instance of 'Function'");
+ }
+};
+
+/*
// Javascript \82Ì Class \92è\8b` (function)\82É\8cp\8f³\8b@\94\\82ð\95t\89Á\82·\82é
Function.prototype.extend = function(baseConstructor) {
F.prototype = constructor.prototype;
obj.prototype = new F();
}
+*/
/*
//\8eg\82¢\95û
-
-var BaseClass = function BaseClass( msg, msg2 )
+var GrandFather = function()
{
- //\82±\82±\82Å\93K\93\96\82È\83\81\83\93\83o\82ð\90é\8c¾
- this.testval = "hello!";
-};
-BaseClass.prototype.method = function()
-{
- //\82±\82Ì\8aÖ\90\94\82ª\8eq\83N\83\89\83X\8co\97R\82Å\82æ\82Î\82ê\82é\82Æ this \82Í\8eq\83N\83\89\83X\82ð\8ew\82·\81B
+ this.fkjwu = 1;
};
+GrandFather.prototype.say = function(){console.log("grandfather");};
-// \94h\90¶\83N\83\89\83X\82Ì\92è\8b`
-var SubClass = function SubClass()
+var Father = function(fff)
{
- //\89º\82Ì\91æ\93ñ\88ø\90\94\82É\82Í\90e\83N\83\89\83X\82Ì\83R\83\93\83X\83g\83\89\83N\83^\82É\93n\82·\88ø\90\94\82ð\94z\97ñ\82Å\8ew\92è
- SubClass.base.apply( this , ["ttwilb", "hikarupsp"] );
-
- // \82±\82±\82Åthis.\83\81\83\93\83o\96¼ (this.\83\81\83\\83b\83h\96¼)\82Å\90e\83N\83\89\83X\82Ì\83\81\83\93\83o\82É\82à\83A\83N\83Z\83X\82Å\82«\82é
-
-}.extend( BaseClass ); // BaseClass \82ð\8cp\8f³
-
-var ss = new SubClass();
+ this.father = fff;
+}.extend(GrandFather, [1], {
+ say : function(){console.log("father");}
+});
+var Son = function(a)
+{
+ this.son = "kk" + a;
+}.extend(Father, ["kk"],{
+ say : function(){
+ console.log(this.son);
+ console.log(this.father);
+ }
+});
// \97á