Видимость JavaScript: частные и привилегированные методы:

Я пытаюсь разобраться и понять, когда использовать приватные и когда привилегированные методы в JavaScript. Согласно этому сообщению: Частные члены в JavaScript, к закрытым членам объекта можно получить доступ и изменить как приватными методами и привилегированными методами. При написании методов получения (для закрытых членов) вы будете использовать закрытый или привилегированный метод? Почему? Для средств доступа (методов, которые изменяют закрытые члены) вы бы использовали частные или привилегированные методы? Почему? Какая стандартная методика используется в этом случае?

И, наконец, в чем разница между использованием приватного и привилегированного методов для доступа к приватной переменной (помимо того факта, что приватный метод нельзя вызывать извне).

function ClassB(given) 
{

    var myVar = given;

    function _get ()
    {
         return myVar;
    };

     this.get = function ()
     {
         myVar = myVar + 3;
         return myVar;
     };


   }

person FranXh    schedule 20.06.2014    source источник
comment
используйте то, что работает для вас, нет жестких и быстрых правил для имитации классического наследования в js.   -  person dandavis    schedule 20.06.2014
comment
Меня больше безопасность волнует. В настоящее время я использую частную функцию для доступа/изменения частного члена и привилегированную функцию, которая вызывает частную функцию. Если я просто использую привилегированный метод, повлияет ли это на безопасность?   -  person FranXh    schedule 20.06.2014
comment
@FranXh Не думайте, что клиентская сторона защищена.   -  person Paul S.    schedule 20.06.2014
comment
на самом деле показанные методы защищены, как их называет Дуг, общедоступны, как их называет большинство людей. нет приватных методов, есть только приватные внутренние функции, которые по сути не публикуются в экземплярах. безопасность заключается в контроле изменений в myVar, и это может произойти из общедоступной, частной или защищенной функции, никакой разницы в безопасности, поскольку только внутренние функции могут видеть myVar, независимо от видимости.   -  person dandavis    schedule 20.06.2014
comment
@dandavis, и это может произойти из публики. Что ты хочешь этим сказать? Доступ к частной переменной можно получить из публичного метода?   -  person FranXh    schedule 20.06.2014
comment
@FranXh: да, общедоступные методы, определенные внутри конструктора, могут видеть частные переменные, определенные внутри конструктора. если под общедоступностью вы подразумеваете методы прототипа вне конструктора, то нет.   -  person dandavis    schedule 20.06.2014


Ответы (1)


Когда вы проектируете свои объекты, вам нужно принять решение, чтобы начать. Вы заботитесь о том, чтобы выставить внутренности объекта внешнему миру?

Если вам все равно, вам действительно следует добавить все свои методы в прототип объекта и всю переменную экземпляра в this в вашей функции-конструкторе. Такой подход может быть нежелательным в некоторых ситуациях. Вот тут-то и появляются привилегированные методы, а также использование замыканий для имитации приватных методов.

Когда вы создаете привилегированный метод, он имеет доступ к закрытым и открытым членам объекта, как вы заметили. Большая разница между созданием привилегированного метода и общедоступного метода в прототипе заключается в том, что привилегированный метод создается для каждого экземпляра объекта, тогда как общедоступный метод в прототипе создается только один раз. Если у вас много привилегированных методов и вы создаете МНОГО экземпляров своих объектов, вы можете видеть, насколько это нежелательно, когда речь идет об использовании памяти.

Я предполагаю, что вы хотите скрыть некоторые из своих внутренних функций от внешнего мира, поэтому вам нужно будет использовать привилегированные методы. Для всех ваших геттеров/сеттеров вам нужно будет определить их как привилегированные и добавить в this (иначе нет особого смысла создавать геттеры/сеттеры, если вы планируете оставить их частными):

function SomeClass() {
    // Private member
    var _privateMember = 1;

    // Public variable
    this.publicMember = 1;    

    // Privileged getter method
    this.getPrivateMember = function() {
        return _privateMember;
    };

    // Privileged setter method
    this.setPrivateMember = function(newVal) {
        _privateMember = newVal;
    };

    // Private method that has access to '_privateMember' and 'this'
    var _privateMethod = function() {
        // Modify private member
        _privateMember = 2;

        // Modify public member
        this.publicMember = 1;

        // Do some other fancy processing privately
    };

    this.doSomethingAwesome = function() {
        // Do some stuff here...

        // Call your private method maybe?
        _privateMethod();
    };
}

// Public methods on prototype do not have access to private methods in your constructor
SomeClass.prototype.publicMethod = function() {
    // Cannot access `_privateMember`

    this.publicMember = 2; // Does have access to 'this'
};

Что касается вашего последнего вопроса, об использовании частного или привилегированного метода для изменения некоторых частных членов... Как вы сказали, вы не сможете получить к нему доступ из внешнего мира, что означает, что это будет довольно бесполезно, если вы добавляют другие функции к вашему частному методу получения и выставляют его внешнему миру через привилегированный метод. Если вы делаете много тяжелой работы внутри конструктора вашего объекта, это может быть веской причиной для создания многоразового метода получения/установки, но это действительно зависит от вашего варианта использования.

Если это не ответило на ваш вопрос, или если вам нужно какое-либо другое конкретное объяснение чего-либо, не стесняйтесь спрашивать.

person DRiFTy    schedule 20.06.2014