LINUX.ORG.RU
ФорумTalks

JavaScript: Зачем нужен Prototype, если JS и так ООП-язык?


0

1

Здравствуйте!

Читаю я значит про фреймверк Prototype http://ru.wikipedia.org/wiki/Prototype_(фреймворк). И там написано такое:

Prototype также добавляет поддержку более традиционного объектно-ориентированного программирования. Для создания нового класса используется метод Class.create(). Классу присваивается прототип prototype, который выступает в качестве основы для каждого экземпляра класса. Старые классы могут быть расширены новыми с помощью Object.extend.

Что-то я не догоняю. В JavaScript нету чтоли возможности создания класса? Нету возможности сделать новый класс, расширив существующий? Начинаю читать про JavaScript http://ru.wikipedia.org/wiki/JavaScript. Там написано:

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

Вопрос. Что подразумевается под фразой «прототипирование обуславливает отличия в работе с объектами по сравнению с традиционными объектно-ориентированными языками»?

Желательно кусок кода показать.


Тем, что к свойства объекта в памяти можно изменить изменив его прототип.

grim ★★☆☆ ()

А Prototype нужен тем, кто перешёл на Javascript c Питона.

grim ★★☆☆ ()

Я в одном конкурсе проиграл, потому что ответил что Javascript это OOP-язык

vertexua ★★★★★ ()

Советую почитать Флэнагана, подобные вопросы отпадут.

eternity ()

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

http://en.wikipedia.org/wiki/Prototype-based_programming

r ★★★★★ ()

В JavaScript нету чтоли возможности создания класса?

Класса именно класса - нет. Но если функция вызывается с new, то она создаёт объект, в этом случае она становится конструктором объекта:

function Lizard() {
  this.$color = 'green';
}
var $speedy = new Lizard(); // Lizard - конструктор для $speedy
alert($speedy.$color); // => green

Нету возможности сделать новый класс, расширив существующий?

А вот эта возможность есть, с небольшой поправкой. Наследуются не классы, а объекты.

// ООП построено на наследовании объектов, а не классов. Для понимания наследования
// надо знать, что такое прототип. Прототип - это объект ассоциированный с
// функцией-конструктором объекта. Сама функция не использует ассоциированный
// прототип. Но созданные функцией объекты содержат заданные в прототипе свойства:
function Rock() { }
Rock.prototype = [1, 5, 13]; // прототипом сейчас является массив
var $guitar = new Rock();
alert($guitar[2]); // => 13
 
var Blizzard = function() { };
Blizzard.prototype = {
  Z : 7,
  PI : 3.14159
};
var diablo = new Blizzard(); // Blizzard это функция-конструктор
alert(Blizzard.PI); // => "undefined"
alert(diablo.Z); // => 7

Простой, но тупой (с недостатками) способ наследования:

// Прототип это скрытая ссылка [[prototype]] недоступная программисту,
// принадлежащая созданному объекту. Значением этой ссылки является доступное для
// программиста свойство prototype у функции-конструктора в момент вызова new.
 
// Важным свойством прототипа является то, что если вызывается какое-то свойство
// объекта и оно отсутствует у самого объекта, начинается рекурсивный поиск в
// объекте на который ссылается прототип. Соответственно, присвоив прототипу
// базовый объект, получаем наследование:
 
var Car = function() {
  this.speed = 120;
};
var Supercar = function() { };
Supercar.prototype = new Car; // Здесь мы сделали Supercar наследником Car
var $ford = new Supercar();
alert($ford.speed); // => 120

Пожалуй, закруглюсь с примерами, если интересно, конспект по ООП в жабаскрипте: http://reaper.epicats.com/2010/06/12/about-javascript/.

Если кратко ответить на вопрос:

Что подразумевается под фразой «прототипирование обуславливает отличия в работе с объектами по сравнению с традиционными объектно-ориентированными языками»?

подразумевается то, что в жабаскрипте есть наследование прототипов, а не классов. Оно более гибкая штука, в частности, без проблем можно имитировать множественное наследование, но цена за это - небольшой сдиг по фазе, чтобы переключиться с классов, на прототипы. Ну, а указанный фреймворк имитирует классическую работу с классами. Короче, нафиг не нужен. ;-)

Reaper ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.