2016-07-20 14 views
0

Hier wird der Typoskriptcode und das entsprechende JavaScript generiert. Warum entschied sich Microsoft dafür, this.greeting zu verwenden, statt eine Variable zu verwenden und die Variable davor zu verbergen, von außen auf den generierten JS-Code zuzugreifen? das Eigentum an private in Typoskript Wechsel wirft nur Kompilierungsfehler, aber der erzeugte Code js ist ditoprivate public in Typescript

//typescript code 
 
class Greeter { 
 
    greeting: string; //why is this not private by default??? 
 
    constructor(message: string) { 
 
     this.greeting = message; 
 
    } 
 
    greet() { 
 
     return "Hello, " + this.greeting; 
 
    } 
 
} 
 

 
let greeter = new Greeter("world"); 
 
console.log(greeter.greeting); //why the heck is 'greeting accessible' 
 

 
//Generated javascript as follows 
 
var Greeter = (function() { 
 
    function Greeter(message) { 
 
     this.greeting = message; //this should have been a var ???? 
 
    } 
 
    Greeter.prototype.greet = function() { 
 
     return "Hello, " + this.greeting; 
 
    }; 
 
    return Greeter; 
 
}()); 
 
var greeter = new Greeter("world"); 
 
console.log(greeter.greeting); //why the heck is 'greeting accessible'

Antwort

2

Es gibt eine große Diskussion um den früh private Schlüsselwort war. Das TypeScript-Team berücksichtigte die Leistungseinbußen in einer sehr großen Anwendung, und sie waren der Meinung, es wäre zu groß. Wenn die Leistungskosten in vielen Anwendungen vernachlässigbar sind, gibt es Fälle, in denen TypeScript zum Erstellen von LOC-Anwendungen mit mehreren Millionen verwendet wird und die Verwendung der Variablen private effektiv verhindert wird, wenn das kompilierte JavaScript tatsächlich versucht, die Variable zu verbergen.

Das Problem bei der Verwendung Konstruktorfunktion lokale Variablen für private Lagerhaltung ist, dass sie nicht von Funktionen auf dem Prototyp-Objekt zugegriffen werden können (was Methoden für eine Klasse in dem erzeugt JavaScript werden). Stattdessen müssen Sie lokale Funktion Objekte erstellen und verbrauchen viel mehr Speicher

Sie können meine Version Ihrer Frage auf den ursprünglichen TypeScript Codeplex site (zusammen mit Anders' Hejlsberg Antwort) sehen.

1

Das ist wahr, dass die Verwendung var macht die Variable nur in bestimmten Bereich sichtbar, aber das Problem damit wäre, wenn Sie die class erweitern dann gibt es keine Möglichkeit, diese Var in neue Klasse zugreifen.

Verwandte Themen