2010-02-26 12 views
5

Sagen, ich habe den folgenden Code:dynamisch eine neue JavaScript-Klasse von einem vorhandenen Objekt erstellen

var album = new MyObject('album'); 

seien angenommen, dass, wenn das Objekt aufgebaut ist, wird eine Reihe von Eigenschaften in Bezug auf nur Alben über AJAX geladen. Wäre es möglich, eine Album Klasse zu erstellen, so dass zu einem späteren Zeitpunkt kann ich dies nur tun:

var anotherAlbum = new Album(); 

Der Album Konstruktor würde die Eigenschaften automatisch gesetzt, die Album-Objekte sind einzigartig, basierend auf was geladen wird, wenn Erstellen MyObject('album')

Antwort

2

JavaScript "Klassen", wie jedes andere Objekt, können dynamisch erstellt werden. Also, ja, das kann gemacht werden.

Sie würden die AJAX-Antwort in dem Code so etwas tun Umgang mit (unter der Annahme, dass die AJAX-Antwort die Namen der neuen „Klasse“ zur Verfügung stellt, und es ist in einer Variablen namens newClassName):

window[newClassName] = function() { 
    // New class name constructor code 
} 

window[newClassName].prototype = { 

    someProperty: "someValue", 

    someMethod: function(a, b) { 
    }, 

    someOtherMethod: function(x) { 
    } 
} 
+0

Meine Hauptfrage wäre, wie schaffen Sie das Objekt ‚Album‘, so dass es an irgendeiner Stelle in der Anwendung aufgerufen werden –

3

Dies ist eigentlich die einzige Vererbung, die JavaScript hat. JavaScript hat prototypal inheritance (mit dem die klassische Vererbung wiederhergestellt werden kann). Das bedeutet, dass die Vererbung von einem anderen Objekt und nicht von einer Klassendefinition stammt.

ein Objekt zu erstellen, die alle Eigenschaften eines anderen Objekts hat, ist einfach:

function Album() { 
    // do whatever initialization you need to here, all the properties of album 
    // are available on 'this' 
    // e.g., 
    doSomething(this.albumName); 
} 
Album.prototype = album; 

var anotherAlbum = new Album(); 
8

JavaScript prototypal ist, nicht klassisch, wenn Sie also in Klassen denken, du bist es falsch zu machen.

Sie müssen den Operator new überhaupt nicht verwenden.

var myObject = {attr1: 'val1', attr2: 'val2'}; 

Dann können Sie eine neue Instanz des Objekts erstellen: Sie können ein neues Objekt mit dem Objektliteral erstellen

var mySecondObject = Object.create(myObject); 

Jetzt können Sie die Attribute von mySecondObject ändern, und wenn es Methoden hat Sie können sie überlasten genauso einfach:

mySecondObject.attr1 = "Hello"; 

mySecondObject.attr2 = function() { 
          return "World!"; 
         }; 

Und dann mySecondObject wird natürlich haben alle Eigenschaften, die Sie myObject bei c gab reation.

Beachten Sie, dass es sich um eine einfache Version handelt, bei der alle Attribute "public" sind. Wenn Sie eine gewisse Privatsphäre benötigen, können Sie dem Mix einige Funktionen hinzufügen. Es ist ein bisschen komplizierter, aber lassen Sie mich wissen, wenn Sie interessiert sind ...

1

Sie können Douglas Crockfords Functional Inheritance Pattern verwenden. Code von Javascript Gute Teile Buch

var mammal = function (spec) { 
    var that = {}; 

    that.get_name = function () { 
     return spec.name; 
    }; 

    that.says = function () { 
     return spec.saying || ''; 
    }; 

    return that; 
}; 

var myMammal = mammal({name: 'Herb'}); 


var cat = function (spec) { 
    spec.saying = spec.saying || 'meow'; 
    var that = mammal(spec); 
    that.purr = function (n) { 
     var i, s = ''; 
     for (i = 0; i < n; i += 1) { 
      if (s) { 
       s += '-'; 
      } 
      s += 'r'; 
     } 
     return s; 
    }; 
    that.get_name = function () { 
     return that.says() + ' ' + spec.name + 
       ' ' + that.says(); 
    return that; 
}; 

var myCat = cat({name: 'Henrietta'}); 

Es verwendet Funktionen, um vorhandene Javascript-Objekte mit neuen Funktionen und Eigenschaften zu dekorieren.So kann man neue Funktionen und Eigenschaften im Fluge zu Ihrem bestehenden Objekt hinzufügen

-1

Sie dies tun können

var NewClass=function(){ 
    this.id=null; 
    this.name=null; 
    this.show=function(){ 
     alert(this.id+" "+this.name; 
    } 
} 
NewClass.prototype.clear=function(){ 
    this.id=null; 
    this.name=null; 
}; 

... 

var ins1=new NewClass(); 
var ins2=new NewClass(); 
+1

Ich sehe nicht, wie dies die 5 Jahre alte Frage beantwortet. –

Verwandte Themen