2016-07-20 3 views
0

Вот код машинописного текста и соответствующий JavaScript, который сгенерирован. Почему microsoft решила использовать this.greeting вместо использования var и скрытия переменной от доступа извне в сгенерированном js-коде? изменяя свойство частного в машинописи только бросаешь ошибку компиляции, но сгенерированный JS код Dittoчастная публика в машинописном документе

//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'

ответ

2

Было много дискуссий вокруг private ключевого слова на ранних стадиях. Команда TypeScript считала стоимость исполнения этого в очень большом приложении, и они полагали, что это будет слишком велико.

Несмотря на то, что во многих приложениях затраты на производительность будут незначительными, бывают случаи, когда TypeScript используется для создания многомиллионных приложений LOC, и им эффективно запрещается использовать переменные private, если скомпилированный JavaScript действительно попытался скрыть переменную.

Проблема с использованием функции-конструктора локальные переменные для частного хранения является то, что они не могут быть доступны из функций на объекте прототипа (что методы на классе стали в генерируемой JavaScript). Вместо этого вам нужно создать локальную функцию объектов и потребляет намного больше памяти

Вы можете увидеть мою версию вопроса на оригинальном TypeScript Codeplex site (вместе с ответом Андерса Хейлсберг в).

1

Это правда, что использование var делает переменную видимой только в заданной области видимости, но проблема с этим связана с необходимостью расширения class, тогда нет способа получить доступ к этому var в новом классе.

Смежные вопросы