我正在研究TypeScript中私有成员的实现,但我感到有些困惑。Intellisense不允许访问私有成员,但是在纯JavaScript中,仅此而已。这使我认为TS无法正确实现私有成员。有什么想法吗?
class Test{
private member: any = "private member";
}
alert(new Test().member);
我正在研究TypeScript中私有成员的实现,但我感到有些困惑。Intellisense不允许访问私有成员,但是在纯JavaScript中,仅此而已。这使我认为TS无法正确实现私有成员。有什么想法吗?
class Test{
private member: any = "private member";
}
alert(new Test().member);
一旦支持WeakMap是更广泛的应用存在例如#3详述了一个有趣的技术在这里。
It allows for private data AND avoids the performance costs of Jason Evans example by allowing the data to be accessible from prototype methods instead of only instance methods.
The linked MDN WeakMap page lists browser support at Chrome 36, Firefox 6.0, IE 11, Opera 23, and Safari 7.1.
let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
constructor(counter, action) {
_counter.set(this, counter);
_action.set(this, action);
}
decrement() {
let counter = _counter.get(this);
if (counter < 1) return;
counter--;
_counter.set(this, counter);
if (counter === 0) {
_action.get(this)();
}
}
}
JavaScript确实支持私有变量。
function MyClass() {
var myPrivateVar = 3;
this.doSomething = function() {
return myPrivateVar++;
}
}
在TypeScript中,它表示为:
class MyClass {
doSomething: () => number;
constructor() {
var myPrivateVar = 3;
this.doSomething = function () {
return myPrivateVar++;
}
}
}
编辑
仅应在绝对需要时谨慎使用此方法。例如,如果您需要临时缓存密码。
使用这种模式会降低性能(与Javascript或Typescript无关),仅在绝对必要的情况下使用。
感谢肖恩·费尔德曼(Sean Feldman)提供的关于此问题的正式讨论的链接-请参阅他的回答。
我阅读了他链接的讨论,这是关键点的摘要:
this
没有某种变通办法,它们将无法访问@private
使注释器识别私有注释可以有效地缩小方法名称的注释器来
注释私有方法在发出的代码中增加可见性支持的总体反论点:
就像类型检查一样,成员的隐私仅在编译器中强制执行。
私有属性实现为常规属性,并且不允许类外部的代码对其进行访问。
为了使某些东西真正成为类的私有对象,它不能成为该类的成员,而应是在创建对象的代码内的函数作用域内创建的局部变量。那将意味着您不能像类的成员那样访问它,即使用this
关键字。
I realize this is an older discussion but it might still be useful to share my solution to the problem of the supposedly private variables and methods in a TypeScript "leaking" out into the public interface of the compiled JavaScript class.
对我来说,这个问题纯粹是表面上的问题,即与在DevTools中查看实例变量时的视觉混乱有关。我的解决方法是将私有声明分组到另一个类中,然后在主类中实例化该类,然后将其分配给一个
private
(但仍在JS中公开显示)名称为__
(双下划线)的变量。例:
当
myClass
在DevTools中查看该实例时,您没有看到它们的所有“私有”成员与真正的公共成员混合在一起(在正确重构的真实生活代码中,它们在视觉上会非常混乱),而是看到它们被整齐地分组在折叠__
属性内: