Подтвердить что ты не робот

Публичные и привилегированные методы в javascript: почему они так называются?

Если я правильно понимаю, согласно Douglas Crockford http://javascript.crockford.com/private.html, "привилегированные" методы похожи на то, что мы знаем как "общедоступные" методы. и "общедоступные" методы - это нечто иное.

Вот как я это понимаю:

  • "Привилегированные" методы могут обращаться к закрытым переменным, поскольку они определены внутри закрытия, когда были определены остальные частные переменные.

    var C = function(){
      var private;
      this.privilegedMethod = function(){
           /* blah blah */
      };
    }
    var cObj = new C();
    
  • "Публичные" методы - это те, которые добавляются к объекту вне самого объекта через прототип.

    var C = function(){
       /* blah blah */
    }
    C.prototype.publicMethod = function(){
        /* blah blah */
    };
    var cObj = new C();
    

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

Итак, мне было интересно, почему Дуглас Крокфорд придумал эти запутанные термины? И почему сообщество javascript приняло эту терминологию? Или, если я ошибаюсь в чем-то, пожалуйста, поправьте меня.

4b9b3361

Ответ 1

Поскольку в JavaScript нет модификаторов видимости, таких как public/private/protected, для того, чтобы приблизиться к миру ООП, Дуглас Крокфорд использует такие имена, чтобы не путать никого, кто пришел, скажем, Java

Привилегированный метод может видеть переменные, определенные внутри функции (Важное примечание здесь - в JavaScript, единственная область видимости - область действия), поэтому они не являются "привилегированными". Да, они могут быть вызваны из экземпляра объекта, но главное здесь, что они видят все вещи, объявленные с помощью var (настоящие личные вещи)

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

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

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

Ответ 2

Влад, я согласен с тобой: я тоже смущен! Посмотрите здесь (из http://javascript.crockford.com/private.html):

function Container(param) {
    // methode privee
    function dec() {
    console.log('private method is looking for private member secret : ' + secret);
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }
    // membres privées
    var secret = 3;
    var that = this;
    // méthode privilégiée
    this.service = function () {
    console.log('priviligied method is looking for private member secret : ' + secret);
        return dec() ? that.member : null;
    };
    // membres publiques
    this.member = param;

}
var myContainer = new Container('abc');

Container.prototype.stamp = function (string) {
    console.log('public method is looking for private member secret : ' + this.secret);
    return this.member + string;
}

console.log(myContainer.stamp('def'));
//for (i=0;i<4;i++)
console.log(myContainer.service());

priviliged vs public

В этом примере jsfiddle будет отображаться:

public method is looking for private member secret : undefined
abcdef
priviligied method is looking for private member secret : 3
private method is looking for private member secret : 3
abc

Итак, ответ: public methods <= > priviliged methods не так ли?

Ответ 3

На традиционном языке OOP все члены класса имеют доступ ко всем другим членам класса.

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

Рассмотрим ниже:

function TheirTrait() {
  var privateData = "foo";
  this.privilegedMethod = function() {
    return privateData;
  }
}

function MyClass() {
  var privateData = undefined;
  this.publicMethod = function() {
    return privateData;
  }
  TheirTrait.apply(this, arguments);
}

var myObject = new MyClass();
myObject.privilegedMethod() // returns "foo"
myObject.publicMethod() // returns undefined

Как вы можете видеть, оба publicMethod и privilegedMethod являются общедоступными в том смысле, что к ним можно получить доступ извне, но privilegedMethod имеет доступ к дополнительным данным.

Ответ 4

Ключевое различие между двумя типами методов заключается в том, что привилегированные методы МОГУТ НАЧАТЬСЯ, это означает, что дочерние классы могут обращаться к ним напрямую, но общедоступные методы недоступны для дочерних классов, конечно, в классическом подходе к наследованию.

Надеюсь, это будет полезно.