D'abord, je vais vous donner un peu de théorie. Une fonction Javascript est un objet dynamique comme Object
. Il a des propriétés et des méthodes et plus peut être ajouté à l'exécution (donc dynamique). Le mot-clé this
est lié à l'objet nouvellement créé. Ainsi, ce que vous faites ci-dessus crée en fait de nouvelles propriétés à la volée lorsque vous transmettez leurs valeurs pour la première fois ... ce qui est bien, mais pas très clair pour un autre lecteur.
Chaque objet et chaque fonction créés par l'utilisateur ont un lien vers un objet prototype "caché". Il s'agit d'un objet anonyme (non accessible par nom) créé par l'environnement d'exécution JavaScript et transmis en tant que référence à l'objet utilisateur via la propriété prototype
. L'objet Prototype a également une référence à l'objet utilisateur via sa propriété constructor
. Tout mettre ensemble, vous pouvez maintenant penser à des fonctions en tant que constructeurs de classes qui ont été créées pour vous pour chaque fonction que vous avez et qui peuvent être accessibles via la propriété prototype de fonctions. Ainsi, vous pouvez ajouter les champs à l'objet prototype directement si:
function BudgetItem(spent) {
this.spent = spent
}
BudgetItem.prototype.spent = 0;
BudgetItem.prototype.setSpent = function(spent) { this.spent = spent };
BudgetItem.prototype.getSpent = function(){ return this.spent };
Un autre problème est paramètres inheritence et passer au constructeur. Encore une fois, votre version est valide mais vous perdez la possibilité de transmettre les valeurs passées et budgétées lors de l'initialisation d'un BudgetType. Ce que je ferais, c'est oublier les prototypes et aller:
function BudgetType(type, spent) {
var instance = new BudgetItem(spent);
instance.type = type;
return instance;
}
Ceci est proche de ce que Scott Sauyet a suggéré ci-dessus mais plus puissant. Vous pouvez maintenant passer les deux paramètres (et plus) et avoir un arbre d'héritage plus compliqué. Finalement, ce que vous pouvez faire est de créer des propriétés privées (ou pseudo-privées, plus précises) en fournissant un getter à une variable autrement automatique (une passée en argument ou initilisée dans la fonction).Ceci est une caractéristique particulière de la langue et cela fonctionne comme ceci:
function BudgetType(type, spent) {
var instance = new BudgetItem(spent);
instance.getType = function() {
return type;
}
return instance;
}
Vous pouvez maintenant accéder au « type » passé dans le constructeur par obj.getType() mais ne peut pas remplacer la valeur initiale. Même si vous définissez obj.type = 'Nouvelle valeur', getType() retournera le paramètre initial passé car il contient une référence à un autre contexte qui a été créé lors de l'initialisation de l'objet et qui n'a jamais été libéré à cause de la fermeture.
espoir qui aide ...
Vous ne avez pas besoin des fonctions getter/setter braindead, si vous avez besoin des fonctionnalités supplémentaires dans les plus tard, vous pouvez toujours les ajouter ensuite en tant que propriétés getter/setter et il fonctionnera de la même dans l'interface publique – Esailija
Tout d'abord, je suggère de ne pas utiliser jQuery ou de telles bibliothèques jusqu'à ce que vous ayez une compréhension FIRM de JS. – SReject
Cela ne répond pas à votre question, mais si vous essayez de maîtriser JS, OOP ou autre, vous devriez certainement lire [Javascript: The Good Parts] (http://www.amazon.com/exec/obidos/ ASIN/0596517742/wrrrldwideweb) par [Douglas Crockford] (http://crockford.com/). – prodigitalson