2010-07-02 13 views
7

Tengo una matriz de objetos existentes definidos con JSON. Obviamente, los objetos son del tipo Object. ¿Cómo los asocio con un tipo de objeto personalizado para darles una funcionalidad específica?Cambiar el tipo de un objeto en JavaScript

+0

si ese objeto tiene atributos adicionales/métodos, ¿qué necesitas más? ¿Podría darnos algún ejemplo? – mykhal

+0

.. quiero decir, ¿ya tiene definidos esos tipos de objetos personalizados o quiere saber cómo hacerlo? – mykhal

Respuesta

11

La forma en que va a trabajar en todos los navegadores es o bien aumentar cada elemento de la matriz con las propiedades y métodos que desea, o pasar el objeto a un constructor y crear un nuevo objeto en función de la edad objeto de propiedades y métodos.

O si no se preocupan por IE:

var obj = { 
    name : "Jeremy" 
}; 

function CustomType() { 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
} 

CustomType.prototype.sayHi = function() { 
    alert(this.greeting + ", " + this.name); 
}; 

obj.__proto__ = CustomType.prototype; 
obj.constructor.call(obj); 

obj.sayHi(); 
+1

Me importa IE, y fui con su sugerencia, creando un método que modifica el objeto pasado y lo devuelve a la persona que llama. Estoy demasiado acostumbrado a usar "bendecir" en Perl y ser capaz de modificar objetos a mi antojo. – Ray

4

No creo que haya ninguna forma de cambiar el tipo de objeto una vez creado. Afortunadamente, probablemente no necesites cambiar la clase de tus objetos; probablemente estés satisfecho con darles a los objetos algunos métodos nuevos y otras funcionalidades. (La única diferencia real es qué pasaría si CAMBIÓ la clase, y la mayoría de las personas no cambian de clase mientras se está ejecutando el código.)

Voy a trabajar un ejemplo para usted. En primer lugar, voy a crear un simple objeto para representar los objetos JSON que tiene:

var myobj = new Object() 
myobj.name = "Fred" 

entonces voy a crear una cierta clase que le gustaría ser capaz de asignar a myobj:

function Speaker() { 
    this.speak = function() { 
     window.alert("Hello, " + this.name); 
    } 
} 

Este nueva clase Speaker tiene algunas funciones útiles: se puede utilizar el método speak() a la salida de información útil:

var s = new Speaker() 
s.name = "Sally" 
s.speak() 

Ejecución que dio m e el mensaje "Hola, Sally". Lamentablemente, no desea un objeto NUEVO (como s) con esta funcionalidad, desea que el objeto existente (myobj) lo tenga. Así es cómo se hace eso:

myobj.speak = s.speak 

Ahora cuando yo haga esto:

myobj.speak() 

veo el mensaje "Hola , Fred".

Para resumir: cree un objeto que haga lo que desee. Copie todos los métodos (y cualquier variable auxiliar) en su nuevo objeto. Excepto por algunos usos inusuales de la herencia, esto hará que su nuevo objeto se comporte como lo desee.

2

Si desea utilizar un método específico en ellas, puede usar apply/call.

O puede copiar los métodos para su objeto personalizado.

function Object1() { 
    this.aValue = "10"; 
} 

function CustomObject() { 
    this.customValue = "6"; 
} 

function convertToCustom(obj) { 
    var custom = new CustomObject(); 
    for(var key in obj) { 
    custom[key] = obj[key]; 
    } 
    return custom; 
} 

var obj = new Object1(); 
var custom = convertToCustom(obj); 

console.log(custom.customValue); // <- 6 
console.log(custom.aValue);  // <- 10 
0

Como complemento a la respuesta de Jeremy, podría utilizar Object.create en vez de jugar directamente con proto. También necesitarás una función de "extensión".

Así que, dado el ejemplo de Jeremy, usted podría tener algo como esto:

var obj = { 
name : "Jeremy" 
}; 


function CustomType() { 
} 

CustomType.prototype.init = function(){ 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
    return this; //let's make it fluent 
} 

CustomType.prototype.sayHi = function() { 
    console.log(this.greeting + ", " + this.name); 
}; 

function extend(obj, props) { 
    for(prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      obj[prop] = props[prop]; 
     } 
    } 
    return obj; //let's make it fluent 
} 

obj = extend(Object.create(CustomType.prototype), obj).init(); 

obj.sayHi(); 
1

Si usted no necesita constructor, que puede hacer como:

Object.assign(new CustomType, {}); 
Cuestiones relacionadas