首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我可以访问TypeScript私有成员,而我不应该能够访问?

为什么我可以访问TypeScript私有成员,而我不应该能够访问?
EN

Stack Overflow用户
提问于 2012-10-04 01:24:20
回答 4查看 100.4K关注 0票数 112

我正在研究TypeScript中私有成员的实现,我发现这有点令人困惑。智能感知不允许访问私有成员,但在纯JavaScript中,这一切都在那里。这让我觉得TS没有正确地实现私有成员。有什么想法吗?

代码语言:javascript
复制
class Test{
  private member: any = "private member";
}
alert(new Test().member);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-04 01:36:58

就像类型检查一样,成员的隐私只在编译器中强制执行。

私有属性是作为常规属性实现的,不允许类外部的代码访问它。

要在类中创建真正的私有对象,它不能是类的成员,它应该是在创建对象的代码内的函数范围内创建的局部变量。这意味着你不能像类的成员一样访问它,比如使用this关键字。

票数 102
EN

Stack Overflow用户

发布于 2016-04-10 12:23:33

一旦对WeakMap的支持更加广泛,示例#3 here中就会详细介绍一种有趣的技术。

它允许私有数据,并通过允许从原型方法而不是仅从实例方法访问数据来避免Jason Evans示例的性能成本。

链接的MDN WeakMap页面列出了Chrome36、Firefox6.0、IE11、Opera23和Safari7.1对浏览器的支持。

代码语言:javascript
复制
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)();
    }
  }
}
票数 11
EN

Stack Overflow用户

发布于 2018-09-15 06:12:52

我知道这是一个较老的讨论,但对于TypeScript中假定的私有变量和方法“泄漏”到已编译的JavaScript类的公共接口的问题,分享我的解决方案可能仍然有用。

对我来说,这个问题纯粹是表面上的,也就是说,在DevTools中查看实例变量时,所有的问题都是关于视觉上的混乱。我的解决办法是在另一个类中将私有声明分组在一起,然后在主类中实例化该类,并将其分配给一个名称为__ (双下划线)的private (但在JS中仍然公开可见)变量。

示例:

代码语言:javascript
复制
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实例时,您看到的不是它的所有“私有”成员与真正的公共成员混合在一起(这在正确重构的实际代码中可能会在视觉上变得非常混乱),而是它们整齐地分组在折叠的__属性中:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12713659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档