Shh, venez ici! Vous voulez entendre un secret?
Classique héritage est testé et essayé approche.
Il est utile de le mettre en œuvre en JavaScript souvent. Les Classes sont un beau concept, d'avoir et d'avoir des modèles pour la modélisation de notre monde des objets est génial.
Classique héritage est juste un modèle. Il est parfaitement OK pour mettre en œuvre classique de l'héritage en JavaScript si c'est le modèle dont vous avez besoin pour votre cas d'utilisation.
L'héritage par prototype se concentre sur le partage de la fonctionnalité et c'est génial (dinasaur pilon génial), mais dans certains cas, vous souhaitez partager des données système et non pas de la fonctionnalité. C'est un problème de l'héritage par prototype ne s'adresse pas à tous.
Donc, vous me dites classes ne sont pas mauvais comme tout le monde continue à me dire?
Non, ils ne le sont pas. Ce que le JS de la communauté fronce les sourcils sur n'est pas le concept de classes, c'est de te limiter à de simples cours pour la réutilisation du code. Tout comme la langue ne pas appliquer de solides ou de typage statique, il n'a pas d'appliquer les schémas de la structure de l'objet.
En fait, derrière la scène intelligente implémentations de la langue peut transformer vos objets normaux à quelque chose ressemblant à de la classique héritage de classes.
Alors, comment faire fonctionner des classes en JavaScript
Eh bien, vous avez vraiment besoin d'un constructeur:
function getVehicle(engine){
return { engine : engine };
}
var v = getVehicle("V6");
v.engine;//v6
Nous avons maintenant une classe de véhicules. Nous n'avons pas besoin de définir une catégorie de Véhicules explicitement à l'aide d'un mot-clé spécial. Maintenant, certaines personnes n'aiment pas faire les choses de cette façon et sont utilisés à la plus classique. Pour ce JS fournit (stupide à mon humble avis) sucre syntaxique en faisant:
function Vehicle(engine){
this.engine = engine;
}
var v = new Vehicle("V6");
v.engine;//v6
C'est la même chose que l'exemple ci-dessus, pour la plupart.
Alors, que sommes-nous en manque encore?
L'héritage et les membres privés.
Et si je vous disais base de sous-typage est très simple en JavaScript?
JavaScript de la notion de typage est différent de ce que nous sommes habitués dans d'autres langues. Que signifie être un sous-type d'un type en JS?
var a = {x:5};
var b = {x:3,y:3};
Est le type d' b
d'un sous-type du type d' a
? Disons que si c'est en fonction de (forte) de sous-typage comportemental (LSP):
<<<< Commencer la partie technique
-
La Contravariance des arguments de méthode dans le sous - type Est conservé intégralement dans cette sorte d'héritage.
-
La Covariance des types de retour dans le sous - type Est conservé intégralement dans cette sorte d'héritage.
- Pas de nouvelles exceptions doivent être levées par les méthodes de la sous-type, sauf si ces exceptions sont eux-mêmes des sous-types d'exceptions générées par les méthodes de la supertype. - Est conservé intégralement dans cette sorte d'héritage.
Aussi,
Tous ces sont encore, sont à nous de la maintenir. Nous pouvons les garder serrée ou faiblement comme nous le voulons, nous n'avons pas, mais nous ne pouvons certainement.
Question de fait, aussi longtemps que nous nous conformons à ces règles ci-dessus lors de la mise en œuvre de notre héritage, nous sommes pleinement en œuvre forte de comportement de sous-typage, qui est une forme très puissante de sous-typage (voir note*).
>>>>> Fin de la partie technique
Trivialement, on peut aussi voir que les sous-typage est titulaire.
Comment cela s'applique à notre Car
exemple?
function getCar(typeOfCar){
var v = getVehicle("CarEngine");
v.typeOfCar = typeOfCar;
return v;
}
v = getCar("Honda");
v.typeOfCar;//Honda;
v.engine;//CarEngine
Pas trop dur, était-il? Qu'en est privé?
function getVehicle(engine){
var secret = "Hello"
return {
engine : engine,
getSecret : function() {
return secret;
}
};
}
Voir, secret
est une fermeture variable. Il est parfaitement "privé", il fonctionne différemment des soldats dans des langues comme Java, mais il est impossible d'accéder de l'extérieur.
Ce sujet d'avoir des soldats dans les fonctions?
Ah! C'est une excellente question.
Si nous voulons utiliser une variable privée dans une fonction que nous partageons sur le prototype que nous avons besoin de firrst comprendre comment JS fermetures et les fonctions de travail.
Dans les fonctions JavaScript sont de première classe. Cela signifie que vous pouvez passer des fonctions de autour de.
function getPerson(name){
var greeting = "Hello " + name;
return {
greet : function() {
return greeting;
}
};
}
var a = getPerson("thomasc");
a.greet(); //Hello thomasc
C'est très bien, mais nous ne pouvons passer à la fonction bornée à un autour de à d'autres objets! Cela vous permet de le faire très lâche de découplage qui est génial.
var b = a.greet;
b(); //Hello thomasc
Attendez! Comment avez - b
savoir le nom de la personne est thomasc? C'est juste la magie de fermetures. Assez impressionnant hein?
Vous pourriez être inquiet au sujet de la performance. Permettez-moi de vous dire comment j'ai appris à cesser de s'inquiéter et commencé à aimer l'optimisation de JIT.
Dans la pratique, à faire des copies de fonctions comme cela n'est pas un gros problème. Des fonctions en javascript sont tous à peu près bien, la fonctionnalité! Les fermetures sont un concept impressionnant, une fois que vous saisir et à les maîtriser vous voyez, c'est bien la peine, et le gain de performance n'est pas vraiment significatif. JS est de plus en plus rapides tous les jours, ne vous inquiétez pas au sujet de ces sortes de problèmes de performances.
Si vous pensez que c'est compliqué, la suite est aussi très légitime. Un contrat commun avec d'autres développeurs simplement dit "Si ma variable commence par _
de ne pas y toucher, nous sommes deux adultes consentants". Cela ressemblerait à quelque chose comme:
function getPerson(name){
var greeter = {
greet : function() {
return "Hello" +greeter._name;
}
};
greeter._name = name;
return greeter;
}
Ou dans le style classique
function Person(name){
this._name = name;
this.greet = function(){
return "Hello "+this._name;
}
}
Ou si vous le souhaitez cache de la fonction sur le prototype au lieu d'instancier des copies:
function Person(name){
this._name = name;
}
Person.prototype.greet = function(){
return "Hello "+this._name;
}
Donc, pour résumer:
Vous pouvez utiliser la classique héritage des formes, ils sont utiles pour le partage de types de données
Vous devez également utiliser l'héritage par prototype, il est tout aussi puissant, et beaucoup plus dans le cas où vous voulez partager de la fonctionnalité.
TheifMaster trompé. Avoir des soldats privé n'est vraiment pas une grosse affaire que l'on pourrait penser en JavaScript, aussi longtemps que votre code définit une interface claire cela ne devrait pas être problématique à tous. Nous sommes tous concenting adultes ici :)
*L'habile lecteur pourrait penser: Hein? N'étiez-vous pas tromper moi là-bas avec l'histoire de la règle? Je veux dire, l'accès à la propriété n'est pas encapsulé.
Je dis non, je n'étais pas. Même si vous n'avez pas explicitement encapsuler les domaines comme le secteur privé, vous pouvez simplement définir votre contrat dans un sens qui n'a pas accès à eux. Souvent comme TheifMaster suggéré avec _
. Aussi, je pense que l'histoire de la règle n'est pas que les grandes d'un accord dans un grand nombre de ces scénarios, tant que nous ne sommes pas changer la façon dont l'accès à la propriété traite des propriétés de l'objet parent. Encore une fois, c'est à nous.