5

J'essaie d'obtenir un objet JavaScript pour utiliser les affectations "this" du constructeur d'un autre objet, ainsi que supposer tous les prototypes de ces objets les fonctions. Voici un exemple de ce que je tente d'accomplir:La fonction Javascript utilisant "this =" donne "Invalid left-side in assignment"

/* 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. 
} 

je serais reconnaissant de vos réflexions sur la façon d'avoir ObjY subsumer les missions de ObjX à « ce » (c.-à-pas à répéter toutes les this.$* = * missions en Constructeur de ObjY) et ObjY assume ObjX.prototype.

Ma première pensée est d'essayer ce qui suit:

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

Idéalement, je voudrais savoir comment faire cela d'une manière prototypique (c.-à-pas à utiliser l'un de ces substituts de POO « classiques » comme Base2).

Il est à noter que ObjY sera anonyme (par exemple factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }) - si j'ai la bonne terminologie.

Merci.

+1

liées: [? Pourquoi ne puis-je attribuer une nouvelle valeur à « ce » dans une fonction prototype] (http: // stackoverflow.com/q/9713323/1048572) – Bergi

Répondre

15

Vous ne pouvez pas vraiment faire cela, parce que la valeur this par définition est immutable, vous ne pouvez pas changer de cette façon à quoi il fait référence.

Une solution serait d'utiliser les méthodes call ou apply pour exécuter votre fonction constructeur ObjX dans l'objet this de ObjY:

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

Dans l'exemple ci-dessus, la fonction ObjX est exécutée en modifiant sa valeur this, donc toutes les extensions de propriété que vous apportez à cet objet dans cette fonction seront reflétées dans le nouvel objet que la valeur this fait référence dans le constructeur ObjY. Dès que la méthode call se termine, l'objet this sera augmenté et vous pourrez ajouter d'autres extensions de propriété, comme l'ajout de la valeur $c.

Edit: A propos des prototypes, votre échantillon ne fonctionnera pas, parce que la propriété prototype n'a pas de signification particulière pour objet dans les positions, il sera comme tout autre bien, il devrait être utilisé sur fonctions constructeur.

Je pense que vous pourriez confondre la propriété prototype des constructeurs avec la propriété interne [[Prototype]] que possèdent tous les objets.

La propriété [[Prototype]] ne peut être réglé par l'opérateur new (par le fonctionnement interne [[Construct]]), cette propriété ne peut pas être modifié, (bien que certaines mises en œuvre, comme celui de Mozilla, vous pouvez y accéder via obj.__proto__;, et ECMAScript 5, la méthode Object.getPrototypeOf a été introduite, mais je ne vous recommanderais pas d'y toucher directement).

En fait, lorsque votre fonction constructeur est exécutée, la propriété [[Prototype]] interne de l'objet que la valeur this fait référence, a déjà été mis à la propriété prototype de son constructeur.

Donc, comme commentaires @Anurag, vous pouvez définir le ObjY.prototype à un nouvel objet ObjX:

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

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

Cela fera que votre ObjY héritent également des propriétés ajoutées à l'ObjX.prototype, et comme vous le voyez, J'ai changé le ObjY.prototype.constructor, puisque l'affectation dans la ligne ci-dessus fera de cette propriété à tort pointer vers ObjX.

Articles recommandés:

+1

Merci CMS. Super lien, aussi. L'autre question est comment assigner les prototypes - cela peut-il être fait depuis le constructeur? –

+0

@Brian, vous êtes les bienvenus, oui j'ai eu une faute de frappe! – CMS

+0

@Brian, définir un objet de ObjX comme le prototype de ObjY, pour obtenir ses méthodes aussi. 'ObjY.prototype = nouveau ObjX;'. Les méthodes et les propriétés, si elles ne sont pas trouvées dans l'objet courant, sont recherchées dans la chaîne du prototype. – Anurag