Y a-t-il des inconvénients pour utiliser une "classe" JavaScript avec ce modèle?
5 Réponses :
C'est bon jusqu'à présent, mais il y a un autre niveau d'accès que vous avez laissé de côté.
Ajouter des méthodes publiques mais non privées, modifiez le prototype de la manière suivante: p> Notez que cette méthode n'a pas accès à des membres privés de Fooclass, mais il est accessible à travers une instance de fooclass. p> Une autre façon d'accomplir cela renvoie ces méthodes à partir du constructeur p> essentiellement, ces méthodes de cachette de données Vous adhérez aux techniques traditionnelles des OOP. De manière générale, l'amélioration de la dissimulation de données et de l'encapsulation dans vos classes est une bonne chose. S'assurer que le faible accouplement facilite le changement de choses sur la route, l'exposition de manière publiquement que possible est vraiment à votre avantage. P> Voir this.publicfn code> est vraiment une méthode privée car elle a accès aux membres et aux fonctions privés. P >
Votre exemple FOOCLASS est incorrect. La sémantique des nouveaux sont effectivement: "var foo = {}; foo .__ proto__ = mooclass.pototype; var temp = fooclass.call (Temp); Si (Temps); Si (ISObject (TEMP)) FOO = TEMP;". Cela signifie dans votre exemple FOO sera le nouvel objet "{vraimentpublicfn: fonction () {...}}" Donc, il n'aura pas le prototype de FOOCLASS ou la fonction PublicFn
Ce que vous faites dans votre exemple n'est pas le modèle de «classe» que les gens pensent à JS - généralement des gens pensent au modèle de classe plus «normal» de Java / C # / C ++ / etc. qui peut être façonné Avec des bibliothèques.
à la place, votre exemple est en fait assez normal et bon JS Design, mais pour la complétude, je vais discuter des différences de comportement que vous verrez entre les "membres" privés et publics que vous avez p> accéder à privé code> de l'une de vos fonctions sera assez plus rapide que d'accéder au public code> car l'emplacement de privé code> peut être déterminé raisonnablement bien avec une recherche statique par le moteur JS. Tentatives d'accès Public code> nécessite une recherche, la plupart des moteurs JS modernes effectuent un degré de mise en cache de recherche, mais il reste plus cher qu'un simple accès varié. P> function Foo2() {
}
Foo2.prototype.f = function(){ return "foo" };
L'inconvénient principal est que vous allez vous retrouver avec une copie de Publicfn pour chaque instance de fooclass. Si vous créez beaucoup d'objets FOOCLASS, il serait plus efficace de
écrire
Notez que ces deux méthodes de création de public ne sont pas équivalentes. on est privilégié et l'autre n'est pas
Cela dépend de vos besoins et de vos performances relatives. JavaScript n'est pas la langue la plus sûre de type et n'est pas très forte en ce qui concerne la visibilité des membres. Traditionnellement, vous pouvez avoir "privé", "privilégié" visibilité "publique" dans un type javascript.
Vous pouvez déclarer des membres privés privilégiés à l'aide de: p> Cet exemple utilise une fermeture de fonction, qui consiste en une déclaration de fonction qui inclut des valeurs de la portée où la fonction est définie. Ceci est acceptable lorsque la visibilité des membres est nécessaire mais peut conduire à des frais généraux. L'interpréteur JavaScript ne peut pas réutiliser les définitions de particuliers ou de PublicFn pour chaque instanciation, car ils se réfèrent à des variables ou des fonctions dans la portée extérieure. En conséquence, chaque instance de Foxlass entraîne un espace de stockage supplémentaire pour PRIVANTFN et PublicFN. Si le type utilise rarement ou avec modération, la pénalité de performance est néglistique. Si le type est utilisé très souvent dans la page, ou si la page est plus d'un style "Ajax" où la mémoire n'est pas libérée aussi fréquente car la page n'est pas déchargée, la pénalité peut être plus visible. P> < p> Une approche alternative consiste à utiliser des membres du prototype. Ce sont des membres publics non difficultés. Étant donné que JavaScript n'est pas entièrement sûr de type et est relativement facile à modifier après sa charge, le type de sécurité et la visibilité des membres ne sont pas aussi fiables pour contrôler l'accès aux entrées de type. Pour des raisons de performance, certains cadres tels que ASP.NET AJAX à la place à la place de la nommage des membres pour déduire des règles de visibilité. Par exemple, le même type d'ASP.NET AJAX pourrait ressembler à: p> Dans ce cas, les membres privés scopés sont privés uniquement dans le nom, le préfixe "_" est considéré. signifier une variable de membre privé. Il a l'inconvénient d'empêcher le député d'être vraiment privé, mais à l'envers de permettre un correctif en mémoire de l'objet. L'autre avantage principal est que toutes les fonctions sont créées une fois par l'interprète et le moteur et réutilisés sur le type. Le mot-clé "Ce" désigne ensuite l'instance du type même si la référence de fonction elle-même est la même. P> Un moyen de voir la différence d'action consiste à essayer avec les deux types (si vous n'avez pas t avoir ASP.NET AJAX, vous pouvez ignorer la dernière ligne de FOOCLASS2 qui appelle registreClass ()) p> donc c'est une question de sécurité et de visibilité des membres contre la performance et la possibilité de patcher en mémoire p> p>
En outre, si je peux mentionner quelque chose d'utile à cela - avec Exemple: p> prototype code>, vous pouvez ajouter des méthodes supplémentaires plus tard dans le code pour prolonger la fonction d'une portée externe. En tant que minuscule bénéfice, tout le corps avec toutes les méthodes ne sera pas rendu à chaque fois, il accélère donc la compilation de performances. Si vous avez déjà toutes les méthodes déclarées à l'intérieur de la fonction, cela prendrait légèrement plus de temps pour rendre. Donc, mon conseil, appliquez-les plus tard uniquement lorsqu'ils deviennent pertinents dans le code actuel. // inside
function fn(arg) {
this.val = arg;
fn.prototype.getVal =()=> {
console.log(this.val);
}
}
var func = new fn('value');
func.getVal();
// declare extern methods
function fn2(arg) {
this.val = arg;
}
fn2.prototype.getVal =()=> {
console.log(this.val);
}
var func2 = new fn2('value');
func2.getVal();