2012-04-14 9 views
6

Zunächst tut mir leid, wenn das eine dumme Frage ist. Ich habe zwei Code-Schnipsel geschrieben. Das erste Code-Snippet von here von John Resig geschrieben und zweifellos ist er einer der Besten und der zweite Codeausschnitt wird von mir aus dem ursprünglichen Code nur um den Unterschied zu verstehen, aber ich bin mir nicht sicher, was ist der Unterschied zwischen beiden und was Das kann und kann ich nicht mit beiden vergleichen. Bitte helfen Sie mir, den Unterschied zu verstehen. Vielen Dank.OOP Javascript und Simple Class Instanziierung

function makeClass(){ 
     return function(args){ 
      if (this instanceof arguments.callee) { 
       if (typeof this.init == "function") 
        this.init.apply(this, args.callee ? args : arguments); 
       } 
       else return new arguments.callee(arguments); 
     }; 
    } 
    var User = makeClass(); 
    User.prototype.init = function(first, last){ 
     this.name = first + " " + last; 
    }; 
    var user = User("John", "Resig"); 
    console.log(user); 

Version Modified

function myClass(args) 
    { 
     if (this instanceof arguments.callee) 
     { 
      this.init = function(first, last){ 
       this.name = first + " " + last; 
      }; 
      this.init.apply(this, args.callee ? args : arguments); 
     } 
     else return new arguments.callee(arguments); 
    } 
    var obj = new myClass('Sheikh', 'Heera'); 
      console.log(obj); 

Warum sollte ich den Prototyp des Objekts verwenden, um eine Methode hinzuzufügen (nach einer Instanz zu machen), anstatt sie in den Konstruktor zu schreiben?

Antwort

7

Ein Hauptgrund dafür, eine Methode für das Prototyp des Objekts zu definieren, anstatt in dem Konstruktor ist, dass das Verfahren in dem Prototyp ist sofort von (im Speicher) geteilt Verfügung und definierte alle Instanzen des Objekts.

Durch Definieren der Methode im Konstruktor ist diese Methode spezifisch für die Instanz des Objekts, das sie erstellt. Wenn Sie 10 von Ihrem Objekt angeben, werden Sie 10 Kopien der Methode der Methode im Speicher haben, obwohl sie alle gleich sind, bis Sie eine von ihnen ändern.

Um klar zu sein, durch shared unter Objektinstanzen, möchte ich nicht sagen, dass die Methode statisch auf alle Eigenschaften funktioniert, auf die sie zugreift. Diese Eigenschaften (falls mit this. definiert) sind immer noch instanzspezifisch. Es ist nur so, dass Sie nicht mehrere Kopien derselben Methode definieren.