2010-02-26 21 views
5

Say Ho il seguente codice:creare dinamicamente una nuova classe JavaScript da un oggetto esistente

var album = new MyObject('album'); 

supponga che quando l'oggetto viene costruito, un gruppo di proprietà relative ai soli dischi vengono caricati tramite AJAX. Sarebbe possibile creare una classe Album in modo che in un momento successivo, posso solo fare questo:

var anotherAlbum = new Album(); 

Il costruttore Album avrebbe impostare automaticamente le proprietà che sono unici per gli oggetti di album, sulla base di ciò che è stato caricato quando creazione MyObject('album')

risposta

2

JavaScript "classi", come qualsiasi altro oggetto, possono essere create dinamicamente. Quindi, sì, questo può essere fatto.

Si potrebbe fare qualcosa di simile nel maneggiare la risposta di codice AJAX (supponendo che la risposta AJAX stava fornendo il nome della nuova "classe", ed è in una variabile chiamata newClassName):

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

window[newClassName].prototype = { 

    someProperty: "someValue", 

    someMethod: function(a, b) { 
    }, 

    someOtherMethod: function(x) { 
    } 
} 
+0

La mia domanda principale sarebbe, come si fa a creare l'oggetto 'Album', in modo che possa essere chiamato in qualsiasi punto dell'applicazione –

3

Questo è in realtà l'unica ereditarietà di JavaScript. JavaScript ha prototypal inheritance (che può essere utilizzato per ricreare l'ereditarietà classica). Ciò significa che l'ereditarietà proviene da un altro oggetto, non da una definizione di classe.

Per creare un oggetto che ha tutte le proprietà di un altro oggetto è semplice:

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 è prototipale, non classica, quindi se si pensa in termini di classi, si sta facendo male.

Non è necessario utilizzare l'operatore new. È possibile creare un nuovo oggetto utilizzando l'oggetto letterale:

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

Quindi è possibile creare una nuova istanza di quell'oggetto:

var mySecondObject = Object.create(myObject); 

Ora è possibile modificare gli attributi di mySecondObject, e se ha i metodi è possibile sovraccaricare altrettanto facilmente:

mySecondObject.attr1 = "Hello"; 

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

E poi mySecondObject volontà, naturalmente, hanno tutte le proprietà che ti ha dato myObject in c reation.

Attenzione, questa è una versione semplice e questo lascia tutti gli attributi "pubblici". Se hai bisogno di un po 'di privacy, puoi ottenerlo aggiungendo alcune funzioni al mix. È un po 'più complicato, quindi fammi sapere se sei interessato ...

1

Puoi usare il modello di ereditarietà funzionale di Douglas Crockford. Codice da Javascript Good Parts book

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'}); 

Utilizza le funzioni per decorare oggetti javascript esistenti con nuove funzioni e proprietà.Ti piace questa è possibile aggiungere nuove funzioni e proprietà al volo per il vostro oggetto esistente

-1

Si può fare questo

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

Non vedo come questo risponda alla domanda di 5 anni. –

Problemi correlati