我正在研究TypeScript中私有成员的实现,我发现这有点令人困惑。智能感知不允许访问私有成员,但在纯JavaScript中,这一切都在那里。这让我觉得TS没有正确地实现私有成员。有什么想法吗?
class Test{
private member: any = "private member";
}
alert(new Test().member);
发布于 2012-10-04 01:36:58
就像类型检查一样,成员的隐私只在编译器中强制执行。
私有属性是作为常规属性实现的,不允许类外部的代码访问它。
要在类中创建真正的私有对象,它不能是类的成员,它应该是在创建对象的代码内的函数范围内创建的局部变量。这意味着你不能像类的成员一样访问它,比如使用this
关键字。
发布于 2016-04-10 12:23:33
一旦对WeakMap的支持更加广泛,示例#3 here中就会详细介绍一种有趣的技术。
它允许私有数据,并通过允许从原型方法而不是仅从实例方法访问数据来避免Jason Evans示例的性能成本。
链接的MDN WeakMap页面列出了Chrome36、Firefox6.0、IE11、Opera23和Safari7.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)();
}
}
}
发布于 2018-09-15 06:12:52
我知道这是一个较老的讨论,但对于TypeScript中假定的私有变量和方法“泄漏”到已编译的JavaScript类的公共接口的问题,分享我的解决方案可能仍然有用。
对我来说,这个问题纯粹是表面上的,也就是说,在DevTools中查看实例变量时,所有的问题都是关于视觉上的混乱。我的解决办法是在另一个类中将私有声明分组在一起,然后在主类中实例化该类,并将其分配给一个名称为__
(双下划线)的private
(但在JS中仍然公开可见)变量。
示例:
class Privates {
readonly DEFAULT_MULTIPLIER = 2;
foo: number;
bar: number;
someMethod = (multiplier: number = this.DEFAULT_MULTIPLIER) => {
return multiplier * (this.foo + this.bar);
}
private _class: MyClass;
constructor(_class: MyClass) {
this._class = _class;
}
}
export class MyClass {
private __: Privates = new Privates(this);
constructor(foo: number, bar: number, baz: number) {
// assign private property values...
this.__.foo = foo;
this.__.bar = bar;
// assign public property values...
this.baz = baz;
}
baz: number;
print = () => {
console.log(`foo=${this.__.foo}, bar=${this.__.bar}`);
console.log(`someMethod returns ${this.__.someMethod()}`);
}
}
let myClass = new MyClass(1, 2, 3);
当在DevTools中查看myClass
实例时,您看到的不是它的所有“私有”成员与真正的公共成员混合在一起(这在正确重构的实际代码中可能会在视觉上变得非常混乱),而是它们整齐地分组在折叠的__
属性中:
https://stackoverflow.com/questions/12713659
复制相似问题