Машинопись частных пользователей

голоса
76

Я смотрю на реализации частных членов в машинописи, и я нахожу это немного сбивает с толком. Intellisense не позволяет получить доступ к закрытому члену, но в чистом JavaScript, все это есть. Это заставляет меня думать, что TS не реализует частных пользователей правильно. Есть предположения?

class Test{
  private member: any = private member;
}
alert(new Test().member);
Задан 03/10/2012 в 18:24
источник пользователем
На других языках...                            


7 ответов

голоса
68

Так же, как и с проверкой типов, конфиденциальность членов, применяется только в компиляторе.

Частная собственность реализуются как обычные собственности, и код вне класса не разрешен доступа к нему.

Для того, чтобы сделать что - то по- настоящему личное внутри класса, он не может быть членом класса, это будет локальная переменная , созданная в область видимости функции внутри кода , который создает объект. Это будет означать, что вы не можете получить доступ к нему , как член класса, то есть , используя thisключевое слово.

Ответил 03/10/2012 в 18:36
источник пользователем

голоса
33

JavaScript поддерживает приватные переменные.

function MyClass() {
    var myPrivateVar = 3;

    this.doSomething = function() {
        return myPrivateVar++;        
    }
}

В машинописном это будет выражаться следующим образом:

class MyClass {

    doSomething: () => number;

    constructor() {
        var myPrivateVar = 3;

        this.doSomething = function () {
            return myPrivateVar++;
        }
    }
}

РЕДАКТИРОВАТЬ

Такой подход должен быть использован только ЭКОНОМЕН , где это абсолютно необходимо. Например , если вам нужно кэшировать пароль временно.

Есть затраты на производительности использования этого шаблона (ненужный из Javascript или машинописи) и должны использоваться только там, где это абсолютно необходимо.

Ответил 06/06/2014 в 17:01
источник пользователем

голоса
11

После того, как поддержка WeakMap более широко доступны есть интересный метод подробно в примере № 3 здесь .

Это позволяет для частных данных и позволяет избежать затрат на производительность, например Джейсон Эванс, позволяя данные должны быть доступны из методов прототипа вместо только методов экземпляра.

Связанная поддержка браузера списков страниц MDN WeakMap в Chrome 36, Firefox 6.0, IE 11, Opera 23 и 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)();
    }
  }
}
Ответил 10/04/2016 в 04:23
источник пользователем

голоса
3

Благодаря Шон Фельдман за ссылку на официальную дискуссию по этому вопросу - см своего ответа на ссылку.

Я прочитал дискуссию , он связан с, и вот краткое изложение ключевых моментов:

  • Предложение: частные свойства в конструкторе
    • проблемы: не могут получить доступ к функциям от прототипа
  • Предложение: частные методы в конструкторе
    • проблемы: так же , как со свойствами, плюс вы теряете преимущество производительности создания функции один раз в класс в прототипе; вместо того, чтобы создать копию функции для каждого экземпляра
  • Предложение: добавить шаблонное к абстрактному доступа к свойству и обеспечение видимости
    • проблемы: главная накладная производительность; Машинопись предназначена для больших приложений
  • Предложение: машинопись уже упаковывает конструктор и метод определения прототипа в затворе; ставить частные методы и свойства есть
    • проблемы с вводом частных свойств в этом замыкании: они становятся статическими переменными; есть не один на один экземпляр
    • проблемы с вводом частных методов в том , что закрытие: они не имеют доступа к thisбез какой - то обходной путь
  • Предложение: автоматически калечить частные имена переменных
    • контраргументы: это соглашение об именах, а не языковая конструкция. Увечье сами
  • Предложение: Аннотируйте частные методы с @privateтак minifiers, признающей , что аннотация может эффективно Минимизировать имена методов
    • Нет существенных контраргументов к этому

Общие встречные аргументы добавления поддержки видимости в излучаемом коде:

  • проблема заключается в том, что сам JavaScript не имеет модификаторов видимости - это не проблема, машинопись в
  • есть уже отработанная схема в сообществе JavaScript: Префикс частные свойства и методы с подчеркиванием, в котором говорится «на свой страх и риск»
  • когда машинопись дизайнеры сказали, что действительно частные свойства и методы не «возможно», они имели в виду «не представляется возможным в наших конструктивных ограничений», а именно:
    • Излучаемый JS идиоматичен
    • Boilerplate минимальна
    • Никаких дополнительных накладных расходов по сравнению с нормальным JS OOP
Ответил 06/10/2016 в 14:51
источник пользователем

голоса
2

В машинописном Частные функции доступны только внутри класса. подобно

введите описание изображения здесь

И он покажет сообщение об ошибке при попытке получить доступ к закрытому члену. Вот пример:

введите описание изображения здесь

Примечание: Это будет хорошо с Javascript и обе функции доступны снаружи.

Ответил 15/07/2016 в 07:33
источник пользователем

голоса
1

Я понимаю, что это старая дискуссия, но она все еще может быть полезно разделить мое решение задачи о якобы частных переменных и методов в Машинопись «утечка» из в открытый интерфейс скомпилированного класса 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);

Когда myClassэкземпляр рассматриваются в Devtools, вместо того , чтобы видеть все свои «частные» член перемешанных с истинно казенными (которые могут получить очень визуально неаккуратны в правильно реорганизованных кодах реальной жизни) вы видите их аккуратно сгруппированы внутри сложенной __собственности:

введите описание изображения здесь

Ответил 14/09/2018 в 22:12
источник пользователем

голоса
0

Многие люди утверждают, что это невозможно из-за ограничений в JavaScript. Я бы сказал, что ограничения в творчестве разработчиков JavaScript.

Я разрабатываю библиотеку прямо сейчас , что личные и защищенные наследуемые члены классов, а также интерфейсы и т.д. называется ClassJS. Проверьте это здесь , на GitHub .

Ответил 12/04/2017 в 01:06
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more