Je voudrais offrir comment je l'ai compris. Je diviserais cela en deux parties: la définition et la mise en œuvre (ou l'utilisation). Suite à la définition que vous avez cité ci-dessus, je voudrais ajouter que l'utilisation de ce code:
var Person = new Class;
Person.extend({
find: function(id) { /* definition */
},
exists: function(id) { /* definition */
}
});
Person.include({
save: function(id) { /* definition */
},
destroy: function(id) { /* definition */
}
});
var person_e = Person.find(1);
var person_e = Person.exists(2);
var person = new Person;
person.save();
person.destroy(2);
Voir ce code en continuité avec le code précédent. Je vais essayer d'énumérer ce qui se passe:
- La classe est définie pour contenir la définition de la fonction. Il n'est pas encore exécuté - donc la classe pointe vers ce bloc dans la mémoire où la définition de la fonction est écrite.
- var Personne = new Classe -> Ceci est équivalent à 'new Class()' - donc l'exécution de Class arrive et le résultat est assigné à Person. Comme il est appelé avec le mot clé 'new', 'this' est assigné à la nouvelle instance de Class.
- Maintenant, que se passe-t-il dans Class()? (i) klass est mis à fonctionner (le travail dont initialise 'this' lorsqu'il est appelé) - mais pas encore exécuté. (ii) Une propriété init est définie sur le prototype de klass; La propriété init est définie sur une fonction vide (que nous écraserons plus tard en fonction de la classe que nous définirions). (iii) Quelques trucs plus fantaisistes avec les propriétés extend et include sur klass (iv) Et klass est retourné -> klass point dans le temps. Par conséquent, appeler 'new Class()' renvoie une fonction appelée 'klass' qui, lorsqu'elle est appelée, effectue l'initialisation sur 'this'. Personne à ce stade, en termes simples, peut être considéré comme tenant la fonction 'klass()'. Donc, Person.extend peut être pensé pour aller à la partie klass.extend du code. klass.extend est une fonction qui attend un objet. Cet objet a des paires de valeurs clés, la clé étant les noms des utilitaires/fonctions et les valeurs étant des définitions de fonctions. Dans l'instruction 'for', nous faisons (var i dans obj) - donc 'i' contient les clés - quand nous faisons 'klass.fn [i]' nous voulons dire klass.prototype.save ou klass.prototype.destroy - puisque l'indice [i] est identique à la notation par points (namespacing). Et nous savons que les méthodes ajoutées à klass.prototype sont disponibles pour les instances de Person, plutôt que d'être ajoutées à Person en tant que propriétés.
Nous appelons new Person() - en effet, nous sommes en train d'exécuter klass, puisque Person contient klass à ce moment, et comme new est attaché, 'this' est passé.Maintenant, l'initialisation de 'klass' se passe sur la propriété init de 'this' (par le formulaire d'application) -> Et cette propriété 'init' que nous venons d'écraser.
klass.fn.parent = klass; // où l'utilisons-nous? //nulle part.
L'avez-vous reçu de 'Prototype.js'? Ce n'est pas si complexe à saisir ou à comprendre si vous savez quand ce code peut résoudre un problème particulier. Juste une question: "Que voulez-vous que ce code fasse?" – Yang