В чем разница между этими двумя представлениями метода в JS - PullRequest
2 голосов
/ 16 марта 2011

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

Итак, вот как я обычно записывал бы метод:

var ReportEnhancements =
 function () {
     this.Name = function()
     {
        alert('It is me!');
     }
}

А вот еще один способ представления методов:

 ReportEnhancements.prototype.Tooltip = {
          setByTitle :function(elementsToTooltip) {
              alert('I am about to be tooltiped!')
         }
 }

Меня озадачивают две вещи:

  1. Когда мне следует использовать ключевое слово prototype?Когда я должен просто объявить метод в имени члена?
  2. Посмотрите на setByTitle и Name, как вы можете видеть, они разные, хотя они оба объявляют методы, и оба метода являются публичными.
  3. Почему разница между this.Name = function () и setByTitle: function ().Почему существует два разных синтаксиса для объявления методов?

Редактировать:

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Одно существенное отличие (хотя это не отвечает на , почему либо предпочтительнее) - это область действия.

В первом случае this.Name() имеет доступ к любым другим переменным, объявленным ввнешняя функция, потому что это все одно замыкание.Он известен как «привилегированный метод».

Последняя версия, полностью объявленная вне первоначальной области видимости, не имеет доступа к этим «закрытым» переменным-членам.

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

РЕДАКТИРОВАТЬ - относительно вашего редактирования модификаторов доступа:

Ну, на самом деле нет доступа модификация .

Первый метод создает «замыкание», изамыкания могут содержать объявления переменных, которые имеют локальную область видимости.Однако функция также является объектом, поэтому добавление свойств к this открывает эти свойства для внешнего мира.Обычный способ «экспорта» метода или переменной заключается в следующем:

var MyType = function() {
    var method = function() { ... };   // this is private variable

    this.method = method;              // this is a public property pointing
};                                     // to the private variable

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

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

1 голос
/ 16 марта 2011

С прототипом вы можете изменять стандартные объекты javascript.Например вы можете сделать

String.prototype.encode = function () {...};

или

Function.prototype.declareMethod = function (param) {this.prototype [param.name] = param.functionBody;верни это;};

Поскольку функция находится в цепочке прототипов, вы можете использовать delcareMethod для всего остального.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...