2010-02-26 8 views
5

Decir que tengo el siguiente código:la creación dinámica de una nueva clase javascript de un objeto existente

var album = new MyObject('album'); 

asumir que cuando se construye el objeto, un montón de propiedades relativas a sólo discos se cargan a través de AJAX. ¿Sería posible crear una clase Album de manera que en un momento posterior, es posible que acaba de hacer esto:

var anotherAlbum = new Album(); 

El constructor Album establecería automáticamente las propiedades que son únicas para objetos de álbumes, en base a lo que estaba cargado cuando creando MyObject('album')

Respuesta

2

JavaScript "clases", al igual que cualquier otro objeto, se pueden crear dinámicamente. Entonces, sí, esto se puede hacer.

Se podría hacer algo como esto en el manejo de la respuesta AJAX de código (suponiendo que la respuesta AJAX estaba proporcionando el nombre de la nueva "clase", y está en una variable llamada newClassName):

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

window[newClassName].prototype = { 

    someProperty: "someValue", 

    someMethod: function(a, b) { 
    }, 

    someOtherMethod: function(x) { 
    } 
} 
+0

Mi pregunta principal sería, ¿cómo se crea el objeto 'del álbum', de modo que pueda ser llamado en cualquier punto de la aplicación –

3

Este es en realidad el único de herencia que tiene JavaScript. JavaScript tiene prototypal inheritance (que se puede usar para recrear herencia clásica). Eso significa que la herencia proviene de otro objeto, no de una definición de clase.

Para crear un objeto que tiene todas las propiedades de otro objeto es simple:

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 es prototípico, no clásica, por lo que si se piensa en términos de clases, lo estás haciendo mal.

No tiene que utilizar el operador new en absoluto. Puede crear un nuevo objeto con el objeto literal:

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

continuación, puede crear una nueva instancia de ese objeto:

var mySecondObject = Object.create(myObject); 

Ahora puede cambiar los atributos de mySecondObject, y si se dispone de métodos se puede sobrecargar con la misma facilidad:

mySecondObject.attr1 = "Hello"; 

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

Y luego mySecondObject, por supuesto, tener todas las propiedades que le dio myObject en c Reacción

Tenga en cuenta que esta es una versión simple, y que esto deja todos los atributos 'públicos'. Si necesita algo de privacidad, se puede lograr agregando algunas funciones a la mezcla. Aunque es un poco más complicado, hágamelo saber si está interesado ...

1

Puede utilizar el Patrón de herencia funcional de Douglas Crockford. Código de Javascript Buen libro de partes

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

Utiliza funciones para decorar objetos javascript existentes con nuevas funciones y propiedades.Como esto se puede añadir nuevas funciones y propiedades sobre la marcha a su objeto existente

-1

Usted puede hacer esto

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

No veo cómo responde esto a la pregunta de 5 años. –

Cuestiones relacionadas