繁体   English   中英

为什么TypeScript编译器的创建者没有将类转换为使变量变为私有的JavaScript闭包

[英]why creators of the TypeScript compiler didn’t turn the class into the JavaScript closure that makes variables private

为什么typescript编译器会将类转换为闭包来实现数据隐藏?

class Person {
    public name: string;     
    private password: string;

    constructor(name:string,password: string) {
        this.name = name;       
        this.password= password;
    }
} 
let p = new Person("mihir","!@#123");

在上面的代码中,我将密码保存为私有变量。所以我们不应该直接访问该变量。 以下代码是从typescript代码编译的。 密码变量保持公开,因为我们在javascript中没有访问修饰符。

var Person = (function () {
    function Person(name,password) {
        this.name= name;
        this.password= password;
    }
    return Person;
})();

var p = new Person("mihir","!@#123");

按照以下代码使用闭包变量可以保护免受外部影响。

var Person = (function () {
    var _pass;     
    function Person(name,password) {       
        this.name = name;        
        _pass = password;
    }
    return Person;
})();   

我们知道数据封装适用于打字稿,而Typescript的目标是编写比javascript更高效的代码。

那么为什么打字稿会将代码转换为封闭? 为什么它将数据隐藏在编译代码中,因为它可以通过闭包实现。

最后没有javacsript就没有打字稿。 那么编译器在编译代码中实现数据隐藏的复杂性是什么?

我发现了一些我认为停止思考打字稿编译器创建者将这个类转换为javascript闭包来制作私有变量的东西。

1)如果我们使用以下代码来保持变量私有

var Person = (function () {
    var _pass;     
    function Person(name,password) {       
        this.name = name;        
        _pass = password;
    }

    Person.prototype.getPassword = function() {
        return _pass;
    }

    return Person;
})();

var p1 = new Person("mihir","!@#123");
var p2 = new Person("khushbu","!@#345");
console.log(p1.getPassword()); // '!@#345'
console.log(p2.getPassword()); // '!@#345'

在上面的示例中,_pass表现为static.since _pass未分配给构造函数,每当创建新对象时,新对象的密码都会覆盖旧对象的密码。这样只适用于单个对象。这是最糟糕的做法。

2)将所有内容移动到构造函数中

var Person = (function () {

    function Person(name, password) {       
        var _pass = password;
        this.name = name;
        this.getPassword = function () {
            return _pass;
        }
    }
    return Person;
})();

var p1 = new Person('mihir','!@#123');
var p2 = new Person('khushbu','!@#456');
console.log(p1.getPassword()); // '!@#123'
console.log(p2.getPassword()); // '!@#456'

但是将一切都移到构造函数中也是一个坏主意。这会导致性能下降。最好不要在javascript上实现私有变量作用域。

因此,要使用原型模式typescript编译器创建者离开了实现私有范围的想法。

每个javascript开发人员都应该使用下划线前缀来“私有”变量,通知消费者您的代码“使用风险自负”。 并完全停止在javascript中使用私有变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM