5

Estoy tratando de obtener un objeto JavaScript para usar las asignaciones "this" del constructor de otros objetos, así como asumir el prototipo de todos esos objetos funciones. He aquí un ejemplo de lo que estoy tratando de lograr:La función Javascript usando "this =" da "lado izquierdo no válido en la asignación"

/* The base - contains assignments to 'this', and prototype functions 
    */ 
function ObjX(a,b) { 
    this.$a = a; 
    this.$b = b; 
} 

ObjX.prototype.getB() { 
    return this.$b; 
} 

function ObjY(a,b,c) { 
    // here's what I'm thinking should work: 
    this = ObjX(a, b * 12); 
    /* and by 'work' I mean ObjY should have the following properties: 
    * ObjY.$a == a, ObjY.$b == b * 12, 
    * and ObjY.getB == ObjX.prototype.getB 
    * ... unfortunately I get the error: 
    *  Uncaught ReferenceError: Invalid left-hand side in assignment 
    */ 

    this.$c = c; // just to further distinguish ObjY from ObjX. 
} 

Estaría agradecido por sus pensamientos sobre cómo tener ObjY subsumir las asignaciones de ObjX a 'esto' (es decir, no tiene que repetir todos los this.$* = * asignaciones de Constructor de ObjY) y tienen ObjY asumir ObjX.prototype.

Mi primer pensamiento es para tratar el siguiente:

function ObjY(a,b,c) { 
    this.prototype = new ObjX(a,b*12); 
} 

Idealmente me gustaría aprender cómo hacer esto de una manera prototípica (es decir, no tienen que utilizar cualquiera de esos sustitutos de programación orientada a objetos 'clásicos' como Base2).

Cabe señalar que ObjY será anónimo (por ejemplo, factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }) - si tengo la terminología correcta.

Gracias.

+1

relacionados: [? Por qué no puedo asignar un nuevo valor a “este” en una función prototipo] (http: // stackoverflow.com/q/9713323/1048572) – Bergi

Respuesta

15

Realmente no puede hacer eso, porque el valor this por definición es inmutable, no puede cambiar de esa manera a lo que hace referencia.

Una solución sería utilizar los call o apply métodos para ejecutar su función ObjX constructor en el this objeto de ObjY:

function ObjY(a,b,c) { 
    ObjX.call(this, a, b * 12); 
    this.$c = c; 
} 

En el ejemplo anterior, se ejecuta la función ObjX cambiar su valor this, por lo tanto, todas las extensiones de propiedad que realice a ese objeto en esta función se reflejarán en el nuevo objeto al que hace referencia el valor this en el constructor ObjY.

Tan pronto como finalice el método call, se aumentará el objeto this y podrá hacer más extensiones de propiedad, como agregar su valor $c.

Editar: Acerca de los prototipos, la muestra no va a funcionar, porque la propiedad prototype no tiene un significado especial para los objetos en posiciones que será igual que cualquier otra propiedad, que debe ser usado en funciones constructoras.

Creo que puede estar confundiendo la propiedad prototype de constructores con la propiedad interna [[Prototype]] que tienen todos los objetos.

La propiedad [[Prototype]] sólo puede ser establecido por el operador new (a través de la operación interna [[Construct]]), esta propiedad no se puede cambiar, (aunque algunas implementaciones, como el Mozilla, se puede acceder a él a través obj.__proto__;, y en ECMAScript 5, se ha introducido el método Object.getPrototypeOf, pero no recomendaría que te metieras directamente con él).

En realidad, cuando se ejecuta la función de su constructor, el [[Prototype]] propiedad interna del objeto que el valor this se refiere, ya se ha establecido en la propiedad de su constructor prototype.

Así, como comentarios @Anurag, podría configurar el ObjY.prototype a un ObjX objeto recién creado:

function ObjY(a,b,c) { 
    ObjX.call(this, a, b * 12); 
    this.$c = c; 
} 

ObjY.prototype = new ObjX(); 
ObjY.prototype.constructor = ObjY; 

Eso hará que su ObjY hereda también las propiedades añadido a la ObjX.prototype, y como ves, Cambié el ObjY.prototype.constructor, ya que la asignación en la línea anterior hará que esta propiedad señale erróneamente al ObjX.

artículos recomendados:

+1

Gracias CMS. Gran enlace, también. La otra pregunta es cómo asignar los prototipos. ¿Se puede hacer eso desde el constructor? –

+0

@Brian, de nada, sí, tuve un error tipográfico – CMS

+0

@Brian, establece un objeto de ObjX como prototipo de ObjY, para obtener sus métodos también. 'ObjY.prototype = new ObjX;'. Los métodos y las propiedades, si no se encuentran en el objeto actual, se buscan en la cadena del prototipo. – Anurag

Cuestiones relacionadas