peterS.: javascript prototype

Beitrag lesen

hallo again Tobias,

im zweiten teil knuepfe ich nahtlos an das letzte bsp. an,
   in dem die zwei gleichlautenden methoden in eine neue funktion
   gleichen namens gepackt wurden, wobei diesmal die fuer beide
   funktionen identischen argumente beruecksichtigt werden;

dies geschieht relativ simpel ueber die jeder funktion zueigene
   methode "apply", so dass auf ein parsen der funktions-strings
   verzichtet werden kann;

der von mir gewaehlte ansatz, zwei bekannte funktionen in einen
   neuen funktions-container zu verpacken, versagt natuerlich erst-
   einmal in dem moment, wo funktionen werte zurueckgeben - dafuer
   muesste man dem folgenden bsp. noch ein paar kleine erweiterungen
   angedeihen lassen;
   da ich aber nicht wirklich weiss, was Dir so vorschwebt, und ich
   deshalb auch aus bequemlichkeit den ansatz ueber "apply" jedem
   anderen, mit komplizierten regulaeren ausdruecken arbeitenden,
   vorziehe, musst Du mit folgender loesung vorlieb nehmen:

var Con = function() {
     this.show_1 = function(text) {
       alert("none prototype method "show_1(text)":\n\ntext: "" + text + """);
     };
   };
   Con.prototype.show_1 = function(text) {
     alert("prototype method "show_1(text)":\n\ntext: "" + text + """);
   };
   Con.prototype.show_2 = function(text) {
     alert("prototype method "show_2(text)":\n\ntext: "" + text + """);
   };

var obj = new Con();

obj.show_1("proof of show_1");
   obj.show_2("proof of show_2");

var methodName, objMethodStr, prototypeStr, objectFct, prototypeFct;

for (methodName in obj) {
     if ((typeof obj[methodName] == "function") && (typeof obj.constructor.prototype[methodName] == "function")) {
       objMethodStr = obj[methodName].toString();
       prototypeStr = obj.constructor.prototype[methodName].toString();
       if (objMethodStr != prototypeStr) { /*
         die ueber den prototypen ererbte methode sowie die
         ueberschreibende methode werden zusammen in eine
         neue methode gepackt - argumente(n-namen) werden
         beruecksichtigt; */
         objectFct = obj[methodName];
         prototypeFct = obj.constructor.prototype[methodName];
         obj[methodName] = function() {
           prototypeFct.apply(null,arguments);
           objectFct.apply(null,arguments);
         };
         alert("merge of object function "" + methodName + "" and of prototype method "" + methodName + ""\n\n" + obj[methodName]);
         obj[methodName]("proof of merge"); // aufruf des neuen vereinigten funktionsobjektes gleichen namens;
       }
     }
   }

die von mir ungepruefte erweiterung fuer "return"-werte
   koennte so aussehen:

var ..., ..., returnObj = {};

...

obj[methodName] = function() {
           returnObj.protoFctValue = prototypeFct.apply(null,arguments);
           returnObj.objectFctValue = objectFct.apply(null,arguments);
           if ((typeof returnObj.protoFctValue != "undefined") || (typeof returnObj.objectFctValue != "undefined")) {
             return returnObj;
           }
         };

...

so long - peterS. - pseliger@gmx.net

--
br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)