javascript - Hvorfor kapsler ikke TypeScript inn private felt?
Hvorfor kapsler ikke TypeScript inn de private variablene?
Gitt følgende TypeScript:
private engine: string;
constructor(engine: string) {
this.engine = engine;
}
start() {
console.log('Starting engine ' + this.engine);
}
}
var car = new Car("Fiat");
car.start();
Når jeg kompilerer får jeg følgende JavaScript:
var Car = (function () {
function Car(engine) {
this.engine = engine;
}
Car.prototype.start = function () {
console.log('Starting engine ' + this.engine);
};
return Car;
}());
var car = new Car("Fiat");
car.start();
engine-variabelen er offentlig. Hvorfor produserer ikke TypeScript noe mer som:
var Car = (function () {
var _engine;
function Car(engine) {
_engine = engine;
}
Car.prototype.start = function () {
console.log('Starting engine ' + _engine);
};
return Car;
}());
Svar #1
Av ytelsesårsaker. Fra Anders, "Problemet med å bruke konstruktørfunksjonens lokale variabler for privat lagring er at de ikke kan aksesseres fra funksjoner på prototype-objektet (som er hva metoder på en klasse blir i den genererte JavaScript). I stedet må du lage lokale funksjonsobjekter, og det bruker mye mer minne... Som du kan se, må du lage ett funksjonsobjekt per instans i stedet for et enkelt funksjonsobjekt som deles av alle instanser gjennom prototypen." Se her for en diskusjon: https://typescript.codeplex.com/discussions/397651
eller her, "mønstre for tvungne private medlemmer i JavaScript har mye ytelsesoverhead. TypeScript retter seg hovedsakelig mot store applikasjoner, så det å kompilere til kode med ytelsesoverhead er ikke optimalt"