/ / pourquoi les créateurs du compilateur TypeScript n'ont pas transformé la classe en fermeture JavaScript qui rend les variables privées - javascript, typescript

pourquoi les créateurs du compilateur TypeScript n’ont pas transformé la classe en fermeture JavaScript qui rend les variables privées - javascript, typescript

Pourquoi le compilateur dactylographié est-il parti pour convertir les classes en fermetures afin de cacher les données?

class Person {
public name: string;
private password: string;

constructor(name:string,password: string) {
this.name = name;
this.password= password;
}
}
let p = new Person("mihir","!@#123");

Dans le code ci-dessus, j'ai gardé le mot de passe comme variable privée.Nous ne devrions donc pas accéder directement à cette variable. Le code suivant est compilé à partir du code dactylographié. La variable mot de passe reste publique car nous n'avons pas de modificateur d'accès en javascript.

var Person = (function () {
function Person(name,password) {
this.name= name;
this.password= password;
}
return Person;
})();

var p = new Person("mihir","!@#123");

Selon le code suivant, utiliser une variable de fermeture peut être protégé de l'extérieur.

var Person = (function () {
var _pass;
function Person(name,password) {
this.name = name;
_pass = password;
}
return Person;
})();

Nous comprenons que l’encapsulation des données est applicable en dactylographie, et son objectif est d’écrire du code plus productif que le javascript.

Alors pourquoi dactylographié a laissé le code de conversion en fermeture? pourquoi il a laissé les données cachées dans le code compilé car elles peuvent être implémentées par la fermeture.

À la fin sans javacsript, il ne peut y avoir de manuscrit. Le compilateur a-t-il donc eu de la difficulté à dissimuler des données dans un code compilé?

Réponses:

4 pour la réponse № 1

J'ai trouvé certaines choses qui, je suppose, ont arrêté de penser aux créateurs de compilateur à script dactylographié de transformer la classe en fermeture javascript pour créer une variable privée.

1) Si nous utilisons le code suivant pour garder la variable privée

var Person = (function () {
var _pass;
function Person(name,password) {
this.name = name;
_pass = password;
}

Person.prototype.getPassword = function() {
return _pass;
}

return Person;
})();

var p1 = new Person("mihir","!@#123");
var p2 = new Person("khushbu","!@#345");
console.log(p1.getPassword()); // "!@#345"
console.log(p2.getPassword()); // "!@#345"

Dans l'exemple ci-dessus, _pass se comporte comme statique.puisque _pass n'est pas affecté au constructeur, chaque fois que vous créez un nouvel objet, le mot de passe du nouvel objet remplace le mot de passe de l'ancien objet. Cela ne fonctionne donc que pour un seul objet. Et c'est la pire pratique.

2) Déplacez tout dans le constructeur

var Person = (function () {

function Person(name, password) {
var _pass = password;
this.name = name;
this.getPassword = function () {
return _pass;
}
}
return Person;
})();

var p1 = new Person("mihir","!@#123");
var p2 = new Person("khushbu","!@#456");
console.log(p1.getPassword()); // "!@#123"
console.log(p2.getPassword()); // "!@#456"

Mais c'est encore une fois une mauvaise idée de tout déplacer dans le constructeur, ce qui entraîne une dégradation des performances.

Donc, pour utiliser les prototypes, les créateurs de compilateurs de typescript ont laissé l'idée d'implémenter une portée privée.

Chaque développeur javascript doit utilisersouligner le préfixe des variables "privées" notifiant au consommateur de votre code que "utilisez à vos risques et périls". Et faites un arrêt complet pour utiliser une variable privée en javascript.