Contexte« Faking » un JavaScript Constructor
Je travaille sur l'amélioration de mes compétences JavaScript et je suis en apprendre davantage sur le prototypage. Je veux mieux comprendre le code dans cette question et toutes les limitations ou les problèmes avec elle. Une chose qui n'a pas été évidente est la définition de constructeurs plus complexes qui font plus qu'une simple initialisation. Ce que je veux faire est d'avoir une classe qui appelle un service web quand il est créé sans avoir besoin d'appeler une méthode juste après l'initialisation. Ce que j'ai fait a été de créer une propriété et d'y assigner une méthode anonyme auto-appelante. Cela semble fonctionner comme je le veux, mais je ne sais pas s'il y a une meilleure approche.
Le code
function AsyncOrderLine(productID) {
var context = this;
this.autoValue;
this._productID = productID;
this._asyncRequestComplete = false;
this.hello = function() {
alert("hello world");
}
this.constructor = (function() {
context.hello();
context.autoValue = "testing: " + productID + "(" + context._asyncRequestComplete + ")";
})()
}
Le résultat
var _asyncOrderLine = new AsyncOrderLine(1001);
Alerte Montré: "Bonjour tout le monde"
_asyncOrderLine.autoValue = testing: 1001(false)
_asyncOrderLine.constructor = 'undefined'
Dans ce cas, je souhaite que le constructeur reste indéfini une fois l'objet créé.
Question
Y at-il une meilleure façon de le faire? Pourrait-il y avoir des effets secondaires imprévus en utilisant cette approche?
D'une manière générale, ce que vous avez fait est très bien. Vous n'avez pas besoin d'exposer une propriété appelée constructeur du tout. Vous pouvez simplement exécuter la fonction dans AsyncOrderLine. Ensuite, vous pouvez éviter l'affectation de undefined à votre _instance.constructor. Cependant, la question est extrêmement large et difficile à répondre formellement. Il y a des moyens infinis pour accomplir ce que vous avez fait. – keparo
"* Ce que j'ai fait était de créer une propriété et d'y assigner une méthode anonyme. *" - Pourquoi as-tu fait ça? –
@ ŠimeVidas J'allais l'appeler autre chose qu'un constructeur et lui assigner une valeur. Je l'ai renommé pour la question. Le problème était que je voulais une fonction à exécuter lorsque j'ai créé l'objet. – dmck