Показать сообщение отдельно
  #12 (permalink)  
Старый 06.02.2009, 11:37
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Андрей Параничев
Ясно, что реализация динамического классового ООП на JavaScript это то же прототипное ООП, вид сбоку.
Это не только вид сбоку, это 97% - то же самое, только в другой терминологии. Неназванная связка "конструктор + прототип" в JS - есть "ссылка на класс + класс" в Python'e.

Ну вот найди сильные отличия:

# python

class A(object):
  def __init__(self):
    self.a = 10

// аналог на JS

function A() {
  this.a = 10
}

x = A() # py
var x = new A(); // js

x.a # 10, py
x.a // 10, js

A.b = 20 # добавим новое свойство в класс, доступное всем инстансам
A.prototype.b = 20; // аналог на js

x.b # 20, py
x.b // 20, js

// Однако, свойство "b" не является родным для объектов "x"
// сделаем его родным

x.b = 30 # py
x.b = 30 // js

x.b # 30, py
x.b // 30, js

// Удалим родное свойство "b"

del x.b # py
delete x.b // js

// Снова, за счет делегации к классу (к цепи классов; в Питоне)
// и к прототипу (к цепи прототипов; в JS)
// доступно свойство "b"

x.b # 20, py
x.b // 20, js

// Более того, можно расширять класс / прототип через инстанс:

x.__class__.c = 30 # py
x.__proto__.c = 30 // js (__proto__ - спечифично для конкретной реализации, но - не суть)

x.c # 30, py
x.c // 30, js

// Наследование

# py

class B(A):
  def __init__(self):
    A.__init__(self)

// js

function B() {
  B.superclass.apply(this, arguments);
}

// блок, для вынесения в обертку (для улучшения code reuse, чтобы каждый раз не повторять одно и то же)

// одна из реализаций

var __inheritance = function () {};
__inheritance.prototype = A.prototype;
B.prototype = new __inheritance();
B.prototype.constructor = B;
B.superclass = A;

// при этом, конструктор может издохнуть после порождения
// объекта, и объект за счет своей (неявной) ссылки на прототип
// будет иметь доступ к прототипу

// аналогичная картина и Python'e:
// сслыка на класс - "А" - может издохнуть,
// но порожденный объект все еще будет иметь
// доступ к классу за счет ссылки на класс, включая явную - __class__

// примеры не привожу, здесь понятно.


Сообщение от Андрей Параничев
Спорить по вопросу статика vs. динамика в рамках JavaScript, как я понимаю, бессмысленно. Поэтому мы говорим только о динамической модели.
Да мы и не спорим, мы рассуждаем. Просто когда говорят о "классовая модель", это может восприниматься как классы из статической модели. В то время, как, практически нет отличий в динамической классовой модели от прототипной (и в Python'e можно динамически менять классы (просто меняя ссылку __class__) и apply'ить (делегировать) к изначально несвязанным методам). Поэтому можно спросить: что такое "Практически все фреймворки стремятся к динамической классовой модели", если уже изначально практически отличий нет. Я вижу ответ, как - лишь добавить обертку для наследования, ну, и, может, добавить пару слотов для какого-нибудь еще синтаксического сахара. В принципе, это удобно.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 06.02.2009 в 12:12.
Ответить с цитированием