gpt4 book ai didi

javascript - 为什么 TypeScript 编译器的创建者没有将类变成使变量私有(private)的 JavaScript 闭包

转载 作者:搜寻专家 更新时间:2023-10-30 20:57:26 24 4
gpt4 key购买 nike

为什么 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");

在上面的代码中,我将密码保存为私有(private)变量。因此我们不应该直接访问该变量。以下代码是从 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,Typescript 的目标是编写比 javascript 更高效的代码。

那为什么 typescript 将代码转换为闭包呢?为什么它将数据隐藏在编译后的代码中,因为它可以通过闭包实现。

最后没有 javacsript 就没有 typescript 。那么编译器在编译代码中实现数据隐藏是否复杂?

最佳答案

我发现了一些我猜想不再考虑让 typescript 编译器创建者将类转换为 javascript 闭包以生成私有(private)变量的东西。

1)如果我们使用下面的代码来保持变量私有(private)

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 的行为是静态的。因为 _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 中实现私有(private)变量范围。

因此,为了使用原型(prototype)模式,typescript 编译器的创建者放弃了实现私有(private)作用域的想法。

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

关于javascript - 为什么 TypeScript 编译器的创建者没有将类变成使变量私有(private)的 JavaScript 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46393358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com