Сообщение от Андрей Параничев
|
Ясно, что реализация динамического классового ООП на 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'ить (делегировать) к изначально несвязанным методам). Поэтому можно спросить: что такое
"Практически все фреймворки стремятся к динамической классовой модели", если уже изначально практически отличий нет. Я вижу ответ, как - лишь добавить обертку для наследования, ну, и, может, добавить пару слотов для какого-нибудь еще синтаксического сахара. В принципе, это удобно.