javascript - Varför kapslar inte TypeScript in privata fält?
Varför kapslar inte TypeScript in de privata variablerna?
Givet följande 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 jag kompilerar får jag följande 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-variabeln är offentlig. Varför producerar inte TypeScript något mer i stil med:
var Car = (function () {
var _engine;
function Car(engine) {
_engine = engine;
}
Car.prototype.start = function () {
console.log('Starting engine ' + _engine);
};
return Car;
}());
Svar #1
Av prestandaskäl. Från Anders, "Problemet med att använda lokala variabler i konstruktörsfunktioner för privat lagring är att de inte kan nås från funktioner på prototype-objektet (vilket är vad metoder på en klass blir i den genererade JavaScripten). Istället behöver du skapa lokala funktionsobjekt och det förbrukar mycket mer minne... Som du kan se, behöver du skapa ett funktionsobjekt per instans istället för ett enda funktionsobjekt som delas av alla instanser genom prototypen." Se här för en diskussion: https://typescript.codeplex.com/discussions/397651
eller här, "mönster för påtvingade privata medlemmar i JavaScript har mycket prestandaöverhead. TypeScript riktar sig främst mot stora applikationer, så att kompilera till kod med prestandaöverhead är inte optimalt"