0

J'explore un modèle dans lequel vous pouvez enregistrer une référence globale à l'instance en cours pour une utilisation simple dans des fonctions anonymes où le mot clé this est hors contexte. Considérez ceci:Instance globale dans javascript prototypique

var instance; 

var a = function(id) { 
    instance = this; 
    this.id = id; 
}; 

a.prototype.get = function() { 
    return (function() { 
    return instance.id; 
    })(); 
}; 


var x = new a('x'); 
var y = new a('y'); 

console.log(x.get()); 
console.log(y.get()); 

Cette évidence ne fonctionne pas depuis instance est définie dans le constructeur, à chaque fois que l'on appelle .get(), instance fera référence le dernier objet construit. Donc, il donne «y» les deux fois.

Cependant, je cherche un moyen de saisir l'instance dans une méthode prototype sans utiliser le mot-clé this, pour rendre le code plus lisible. Singletons n'est pas une option ici, j'ai besoin de l'héritage prototypique.

Répondre

1

Modifier: Puisque vous éviter de stocker « instances locales », il y a quelques approches, par exemple:

En utilisant call ou apply pour modifier la valeur this de la fonction invoquée:

var a = function (id) { 
    this.id = id; 
}; 

a.prototype.get = function() { 

    return (function() { 
    return this.id; // the inner `this` value will refer to the value of outside 
    }).call(this); 
}; 

En utilisant un argument:

//.. 
a.prototype.get = function() { 

    return (function(instance) { 
    return instance.id; 
    })(this); 
}; 

Le nouveau ECMAScript 5e édition a introduit la méthode bind, ce qui est extrêmement utile pour conserver les arguments liés valeur et en option this, vous pouvez trouver une implémentation compatible here:

//.. 
a.prototype.get = function() { 
    var boundFunction = (function() { 
    return this.id; 
    }).bind(this); 

    return boundFunction(); // no matter how the function is invoked its `this` 
};      // value will always refer to the instance. 
+0

oui, exactement. Je cherche un moyen d'éviter d'enregistrer des instances locales pour chaque méthode de prototype lors de l'utilisation de fonctions anonymes. – David

+0

Je suppose que c'est un "non", mais merci de fournir des modèles pour mettre le contexte dans des fonctions anonymes. – David

Questions connexes