Прототип и функциональный ООП в JavaScript - PullRequest
14 голосов
/ 13 октября 2009

Каковы плюсы и минусы каждого типа / подхода в написании объектно-ориентированных скриптов?

Лично я нашел замыкания (функциональный подход) как способ инкапсуляции состояния более естественным и возможно более элегантным. Однако я слышал, что такое использование замыканий медленнее в реализациях JavaScript.

Я бы хотя бы хотел знать, где прототипный подход будет наиболее подходящим.

Ответы [ 2 ]

14 голосов
/ 13 октября 2009

«Функциональный» стиль (большинство людей называют это «традиционным ООП»):

  • Преимущество: ООП, которое работает так, как все (или, по крайней мере, Java-программисты) знакомы, включая «по-настоящему» частные методы и переменные
  • Недостаток: Javascript не был разработан для этого типа ООП, поэтому вам придется прыгать через множество обручей, чтобы заставить его работать. Эти циклы усложняют отладку, а также повышают производительность (хотя точная стоимость будет зависеть от того, насколько / насколько вы их используете)

Стиль прототипа:

  • Преимущество: Это ООП в соответствии с тем, для чего был разработан Javascript.
  • Недостаток: Это не то, к чему вы привыкли (если только у вас нет опыта работы с другими языками наследования прототипов)

Так что, если производительность не является большой проблемой для вас, и вы знакомы только с традиционным ООП ... сделайте это (шаблоны проектирования Javascript от APress имеют хороший шаблон для этого). Но если производительность имеет значение или вас беспокоит дополнительный уровень абстракции, усложняющий вашу отладку, найдите время, чтобы узнать, как работает наследование прототипа; Вы будете лучшим программистом Javascript для этого.

P.S. Если вас беспокоит отсутствие настоящих «приватных» методов со стилем прототипа, я настоятельно рекомендую прочитать: http://snook.ca/archives/javascript/no-love-for-module-pattern Он дает отличное объяснение того, почему настоящие «частные» члены на самом деле плохи (по крайней мере, в большинстве сред разработки JS).

7 голосов
/ 13 октября 2009

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

function Animal() { }
function Cat () { }

Animal.prototype.sleep = function() { /* blah */ };
Cat.prototype = new Animal;
Cat.prototype.meow = function() { /* blah */ };

var simon = new Cat();
simon.sleep();
simon.meow();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...