Цитата:
|
Цитата:
Ну вот найди сильные отличия: # 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__ // примеры не привожу, здесь понятно. Цитата:
|
Dmitry A. Soshnikov,
Спасибо за разъяснения. Получается, что простая реализация наследования реализуется с избыточным кодом: var __inheritance = function () {}; __inheritance.prototype = A.prototype; B.prototype = new __inheritance(); B.prototype.constructor = B; B.superclass = A; Который рациональнее прятать в отдельную функцию. Получается, что это скорее "стандартный прием", чем простое упрощение. Цитата:
Фреймворки и убирают этот момент, делая динамические классы: var myClass = new Class({ "extend": myParentClass, "constructor": function() { /* "конструктор" */ }, "property": "value" }); Я и хотел узнать, насколько такой подход необходим и насколько считается "плохим тоном", говоря о JavaScript. Получается, что такой вариант помогает убрать избыточность, которую порождает обычный подход конструктор-прототип. Хоть я и разобрался в наследовании на прототипах, но думал, что что-то упустил. Потому что не понимал, зачем во фреймворках используется "эмуляция классического ООП", а именно - вид динамического ООП на классах. |
Цитата:
Касательно же обертки - никакого плохого тона. Иначе "плохим тоном" можно было бы назвать и это: for (var k = 0; k < 3; k++) { alert(k); } У нас есть повторяющийся кусок кода, мы его выносим в цикл. Можно было бы привести пример - выносим в функцию - не суть, то же самое. Иначе: alert(0); alert(1); alert(2); Это, стало быть, не "плохой тон", т.к. мы не используем обертку для повторяющегося куска кода. Ну, да, code reuse методом copy-paste - очень "красивый" метод ;) |
Цитата:
|
Zeroglif,
Там ничего против, естественно, не происходит. Я просто хотел узнать насколько необходимо использование оберток в реализации наследования. |
Цитата:
|
Вставлю свои "пять копеек"...
Основная суть данной темы - не красивость или какая-то верность принципам классического ООП. Просто классовое наследование может существенно облегчить жизнь при реализации сложных проектов. Что я понимаю под классовым наследованием? 1. Возможность четкого определения принадлежности объекта классу (instanceOf) 2. Возможность вызова конструктора или любого метода базового класса Это то, что хочется получить. Очевидно, что в JavaScript без "обёрток" не обойтись. Ну, а чем "элегантнее" и проще это будет сделано, тем лучше. Кстати, интересно будет узнать ваше мнение, коллеги, по поводу моей "обёртки" (Классическое наследование в JavaScript). Буду благодарен за любые отзывы :yes: |
Цитата:
|
Цитата:
var DerivedClass = function() { arguments.callee.$super.call(this); }.$extends( BaseClass ).$class( function ($super) { this.someMethod = function () { return $super.someMethod.call(this); } }); Что тут сложного? Вопрос серьёзный, т.к. мне интерестно узнать мнения разных людей. |
Часовой пояс GMT +3, время: 23:23. |