Comment mettre en place JavaScript espace de noms et classes correctement?
Il semble il ya tellement de façons de mettre en place un JavaScript de l'application de sorte qu'il est source de confusion quant à ce qui est la bonne ou la meilleure. Existe-il une différence dans les techniques ci-dessous, ou une meilleure façon de faire cela?
MyNamespace.MyClass = {
someProperty: 5,
anotherProperty: false,
init: function () {
//do initialization
},
someFunction: function () {
//do something
}
};
$(function () {
MyNamespace.MyClass.init();
});
D'une autre manière:
MyNamespace.MyClass = (function () {
var someProperty = 5;
var anotherProperty = false;
var init = function () {
//do something
};
var someFunction = function () {
//do something
};
return {
someProperty: someProperty
anotherProperty: anotherProperty
init: init
someFunction: someFunction
};
}());
MyNamespace.MyClass.init();
La première technique se sent plus comme une classe. Je viens de côté serveur d'arrière-plan si cela fait une différence. La deuxième technique semble plus redondant et un peu maladroit, mais je vois ce beaucoup trop. Quelqu'un peut-merci de m'éclairer et de conseiller la meilleure façon d'aller de l'avant? Je veux créer une application avec beaucoup de classes de parler les uns aux autres.
- Ce n'est pas en utilisant la programmation orientée objet JS tellement que l'utilisation du motif de module.
- Aussi, vous avez implicite que les deux méthodes sont équivalentes, mais la deuxième méthode n'est pas valable. La manière que vous avez déclaré les variables privées est syntaxiquement invalide, vous voulez juste un régulier instruction var.
- Thx, j'ai fixé la deuxième méthode.
- Si vous êtes intéressés à en apprendre plus, je vous recommande fortement de Douglas Crockford du Javascript: Les Bonnes Pièces. Il offre non seulement un Javascript approche classique de la programmation orientée objet, mais explique aussi comment le Javascript est plus LISP-comme des pièces peut être utilisé pour créer d'autres structures étonnantes. À partir du sol-up, il explique comment et pourquoi chaque structure qui fonctionne et ce qui fonctionne le mieux. Aussi, vous pouvez être personnellement intéressé à l'apprentissage CoffeeScript, en particulier pour ses construit en la structure de la classe.
Vous devez vous connecter pour publier un commentaire.
Faire aucune de ces choses.
Faire un javascript "classe":
Un avec statique vars:
Avec un "constructeur" (tous les exemples ont un "constructeur", celui-ci possède des paramètres de travailler avec):
Avec tous les ci-dessus vous peut faire:
Mais vous ne peut pas faire (de l'extérieur):
new MyClass()
. Je vais ajouter un exemple avec un constructeur.Le premier exemple est tout simplement un Objet littéral - il ne peut pas être instanciée, et n'a pas privé les membres. Le deuxième exemple est une mauvaise syntaxe (
var someProperty: 5
devrait êtrevar someProperty = 5
), mais est à l'aide d'une fermeture à encapsuler privé interne de l'état au sein d'une auto-invocation de fonction anonyme.La deuxième approche semble meilleure pour l'encapsulation des membres privés, mais qui pourrait être plus "orienté Objet" et en fait une classe instanciable:
Ensuite, vous pouvez instancier avec le "nouveau" mot-clé:
- Je utiliser la syntaxe suivante pour les classes instanciables avec l'espace de noms
jsfiddle: http://jsfiddle.net/rpaul/4dngxwb3/1/
Pourquoi vous devriez ne jamais les utiliser
comme dans le deuxième exemple:
Lorsque vous utilisez l'espace de noms, vous devez penser à ce sujet en tant que sujet de déclaration, pas de l'instance.
Et pas de metter combien Module anti-patter était populaire. Déclaration vous donne la possibilité d'utiliser le même code avec les différentes instances dans un de la manière prévue pour les autres développeurs . La qualité du code et de la simplicité de sa lecture augmente. L'objectif de n'importe quel développeur est d'écrire un code simple à lire, pas à court terme ou de la R. D. Y. - mais simple à lire, et être understanded par un autre développeur. Qui diminue le nombre de bugs de la première. (c) S. McConnell
Comment combiner l'espace de noms et la déclaration de la classe:
Accéder à votre valeur:
Maintenant, pour la Classe et la Fonction: Si vous utilisez
new
, le motthis
à l'intérieur de la fonction de point à son constructeur. Si vous n'utilisez pasnew
,this
aura point de l'espace de noms. Donc,À l'aide d'une Classe:
À l'aide de la Fonction:
Si vous construisez un objet sans
new
,this
aura point de l'espace de noms, de sorte que l'espace de noms sera "détruit" parce queMyClass.class_property
etMyClass.class_method
seront ajoutés.