2016-07-20 3 views
0

여기에 타이프 스크립트 코드와 해당 JavaScript가 생성됩니다. 왜 Microsoft는 var를 사용하는 대신 this.greeting을 사용하고 생성 된 js 코드에서 외부에서 변수에 액세스하지 못하도록 선택 했습니까? 타이프에서 비공개로 속성을 변경 만 컴파일 오류가 발생하지만, JS 생성 된 코드는 초기에 private 키워드 주위에 많은 논의가 있었다 저두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'

답변

2

입니다. TypeScript 팀은 매우 큰 응용 프로그램에서이 성능 비용을 고려했으며 너무 큰 것이라고 생각했습니다.

많은 응용 프로그램에서 성능 비용은 무시할 수 있지만, TypeScript를 사용하여 수백만 개의 LOC 응용 프로그램을 빌드하는 경우가 있으며 컴파일 된 JavaScript가 실제로 변수를 숨기려고 시도하면 실제로는 private 개의 변수를 사용할 수 없습니다.

전용 스토리지 생성자 함수를 로컬 변수 사용의 문제점은 (a 클래스의 메소드는 생성 된 자바 스크립트가 무엇 임) 프로토 타입 객체 함수에서 액세스 할 수 없다는 것이다. 대신 당신은 지역의 기능 객체를 생성해야하고는 (앤더스 '헤 즐스 버그의 대답과 함께) 당신은 원래 TypeScript Codeplex site에 귀하의 질문의 내 버전을 볼 수 있습니다 더 많은 메모리를

를 소비한다.

1

var을 사용하면 해당 범위에서 변수가 표시되지만 실제로 문제는 class을 확장해야 할 때 새 클래스에서 해당 변수에 액세스 할 수 없다는 것입니다.

관련 문제