Как работает функция Class
В этом посте мы рассмотрим пошагово как устроена изнутри всеми нами любимая функция Class.
Вначале я создал красивую обертку под описание классов: function Class(Prototype) { function Class() { /** @namespace this.__construct */ if (this.__construct)this.__construct.apply(this, arguments) } Class.prototype = new Prototype; return Class } var Cat = new Class(function () { this.__construct = function (name) { this.name = name || 'Neo'; }; this.say = function () { alert(this.name) }; }); new Cat().say(); Благодаря чему теперь можно описывать свойства методы и конструктор все в одном изолированном месте и ни чего больше не болтается) Потом я добавил возможность добавлять классу статические свойства(8 строчка): function Class(Prototype) { function Class() { /** @namespace this.__construct */ if (this.__construct)this.__construct.apply(this, arguments) } Class.prototype = new Prototype(Class); return Class } var Cat = new Class(function (Cat) { Cat.ololo = 11; }); alert(Cat.ololo); Далее я добавил возможность классам наследоваться друг от друга(9 строчка): function Class(Prototype, superclass) { function Class() { /** @namespace this.__construct */ if (this.__construct)this.__construct.apply(this, arguments) } if (superclass) Prototype.prototype = superclass.prototype; Class.prototype = new Prototype(Class); return Class } var Animal = new Class(function () { this.run = function () { alert('run') }; }); var Cat = new Class(function () { this.jump = function () { alert('jump') }; }, Animal); new Cat().run(); new Cat().jump(); Потом я добавил возможность обращения к перекрытым методам через this.super(12-26 строчка): function Class(Prototype, superclass) { function Class() { /** @namespace this.__construct */ if (this.__construct)this.__construct.apply(this, arguments) } if (superclass) Prototype.prototype = superclass.prototype; Class.prototype = new Prototype(Class); if (superclass) for (var key in Class.prototype) if (Class.prototype.hasOwnProperty(key) && key in Prototype.prototype && Class.prototype[key] instanceof Function && Prototype.prototype[key] instanceof Function) { Class.prototype[key] = (function (key) { var method = Class.prototype[key]; return function () { this.super = Prototype.prototype[key]; return method.apply(this, arguments) } })(key) } return Class } var Animal = new Class(function () { this.run = function () { alert('run') }; }); var Cat = new Class(function () { this.run = function () { this.super(); alert('...and jump') }; }, Animal); new Cat().run(); ВСЁ)) А больше ни чего и не нужно) дальше уже ваша фантазия что с этим делать. Шаблоны того как я этим работать и зачем это вообще нужно я уже предлагал) Кто прочел, тот молодец. ----------------------------------------------------- Почему я сделал var Ololo = new Class(function(){ }); а не var Ololo = Class.extends(function(){ }); Потому что new Class очевиднее чем Class.extends или Ololo.extends |
Я уже ненавижу функцию Class.
Если ещё хоть одна сволочь покажет мне как эмитировать классы я его убью к чёрту :-E |
Еще один человек думающий что функция Class пытается эмитировать классы из других языков в javascript'е... Тысячи их.. Не обращаем внимание, он не глупый и не "плохой", он просто не читал описание к первым версиям функции. Не судите его строго, его можно понять.
|
опять максимус со своими котятами
|
о, уже кому-то припекло...
|
Точняк максимальноМинимальный
блин а я повёлся )) |
Цитата:
|
this.super как я понял вызывает одноименный (к тому из которого он вызывается) метод?
|
да), перекрытый родительский, таким образом мы сохраняем старый функционал и еще и расширяем его в дочерних классах.
п.с. напомню что это просто обьяснение того как Class работает, на самом деле там еще немного рющек навешано, и оптимизаций. а также можно менять слово super на какое понравится. |
навскидку, instanceof не работает ...
|
Цитата:
|
и ДА, на каждый перекрываемый метод родительского класса в дочернем создает замыкание. И я думаю потеря в 50 миллисекунд на 1000000 операций того стоит.
все ради того чтобы писать не (как в педыдущих версиях) patent.run.apply(this, arguments); а this.super(); п.с. к слову, в оригинальной версии работает даже new Cat instanceof Cat // true new Cat instanceof Animal // true new Cat instanceof Class // true и Class.prototype.q = 11 new Cat().q // 11 и все это с поддержкой ie 6 |
Цитата:
|
если бы не ишаки то добавил бы фиксированный this и define property
а вообще официально можно поддерживать только текущую и предыдущую версии чего-либо.. то есть щас ишак 10 и 9, 8 уже можно больше не пддерживать и посылать всех нахуй. |
Теперь собственно зачем это нужно, за тем чтобы конструктор был таким же методом как и все остальные и тоже наследовался.
Иначе мы не сможем сделать нормальное наследование. Например: function Button (){ document.createElement('div') } function Toggle (){ /* бла бла бла преключатель на основе кнопки */ } Toggle.prototype = new Button; ТАК ШТОЛЕ НАМ НАСЛЕДОВАНИЕ ДЕЛАТЬ? Вот и я про то, конструктор должен быть методом (в нашем случае это протектед метод __construct который наследуется и скрытый) А так же затем чтобы можно было удобно обращаться к перекрытым родительским методам через this.super(). а не так : this.run = function(){ Object.getPrototypeOf(this).run.apply(this,arguments); alert('...and jump') } все, больше у этой байды назначений нет. если вы не пользуете наследование в своих проектах то Class и нахуй не нужна. И вообще, для тех кто не понимает что такое ооп и что такое классы вообще, чтобы вы не плакались, замените название функции на Type. |
Цитата:
В реальной жизни у программы есть назначение, у программы есть заказчик, и у программы есть пользователи. Требования к ПО определяет не программист, а заказчик. заказчиков требующих поддержку олдскульных браузеров можно поделить на две категории. Просто тупые - ты гордо говоришь что сделал, клиент идёт домой запускает XP, запускает 7й ишак с кучей плагинов на пол экрана :) и видит что ничего не работает. В истерике звонит тебе и начинает орать что он заплатил деньги, что вы долго долго делали и всё равно ни хуя не работает. Короче вы уроды, недоучки и дебилы в его глазах, и вообще он хочет обратно свои деньги и никогда работать с вами он больше не будет. умные - у них есть статистика по браузерам посетителей их ресурса. И тут выясняется что допустим целевая аудитория врачи, основная ось на рабочих пк у них XP, установка программ обычно запрещена администратором компов. Получается что часть бедолаг сидит тна 7мом а то и 6м ишаке. Заказчик видит эту статистику, звонин вам и обьясняет "дык ребят я всё понимаю но я немогу позволить себе пожертвовать 20% посетителей", и ты либо отказываешся от заказа либо выполняешь его требования. Требования определяет заказчик а ни программист. Иногда требования некорректны иногда противоречивы или невыполнимы(прим HTML5 CSS3 анимацию на 6ie). Но с требованиями нужно и можно работать, существует даже такое направление как инженерия требований, существует специальность инженер по требованиям (редко- редко). А вот посылать, просто потому что не хочется что-то делать можно только в фантазиях. |
Цитата:
Цитата:
// JS 1.5 function () { return false; } // JS не помню какой версии function () false; тем более, что на хабре начали всё чаще публиковать статьи про ФП - почему бы не перейти? кода действительно намного меньше получается. Цитата:
fadeIn и fadeOut программируется на фильтрах - я хочу сказать, что это то же самое, что и css3 анимация. там ещё куча фильтров, но они анимируют изменение состояния элемента, а не изменение значений свойств - так, например, в IE можно анимировать смену innerHTML, а в других браузерах придётся выёпываться, и наоборот. |
какой нафиг функциональный язык если "функции" в js являются объектами?
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Можешь делать по своему, в конце концов интегрироваться ли тебе в общество решай сам. Если всё таки решишь интегрироваться то будешь считаться с чужими потребностями а не только со своими. Пример про врачей из моей практики, замечательные постоянные клиенты. |
Цитата:
и что? вообще весь язык построен на прототипном наследовании, но это не отменяет его мультипарадигменности. |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Кто нибудь понимает вообще что несет этот человек?
|
подрастёшь - поймёшь
|
насрать в прототипы, изменить поведения функции какие-то, ты понмиаешь что ты поехал, все уже?
|
Цитата:
Цитата:
выражения, что там, что там. какая разница? разница только в том, что 2+2 V8 сразу превратит в 4, а в хаскеле так и останется 2+2, но ленивость можно самому сэмулировать. Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
> выражения, что там, что там. какая разница?
разница, как я уже сказал, в том, что создавая функцию в js мы фактически создаём объект со всеми присущими объекту свойствами в том числе и наследованием свойств от прототипа. мы не можем создать просто функцию как в том же хаскеле. мы всегда оперируем объектами. так что js от пяток до макушки - ООП. > в хаскеле так и останется 2+2 да ладно? > то, что в функциях JS есть побочные эффекты, это не значит, что можно писать без них (просто не трогать ничего, кроме локальных аргументов, например) нельзя? в том то и дело, что нельзя. я не могу гарантировать что функция function(){ return 'Array:' + [] } всегда возвращает один и тот же результат. и компилятор не может. это уже не функция в терминах ФП, так как значение зависит не только от аргументов. > это да. но посмотрим, может в будущем что-нибудь изменится разве что введут ключевое слово pure, но это врятли, так как вместо этого изобретают всяких "воркеров". |
Цитата:
Цитата:
Array.prototype.toString = function () { return Math.random(); }; Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
tenshi, melky, вы зафлудили тему про его любимую функцию Class. Он не переживет :D
|
Цитата:
|
небольшое завышение чсв
|
godofjavascript,
Не заморачивайтесь, подобные темы нун выстаивать холодными, как студень, тады через время осознаюца плюсы и минусы, Каждый скриптёр видит своим долгом создать функции класса - тут кого ни ткни пальцем - не попадёте в того, кто не делал - отсель и скепсис |
Deff, дружище, а где лучше написать что это не реализация классов из других языков на яваскрипт?
Ну просто мне немного надоело это говорить каждый раз, может написать где-то чтбоы видно было сразу? Я вроде бы писал уже чем эта функция отличется от остальных и вообще зачем она нужна. Нет? |
godofjavascript, очевидно, что это простая обёртка над прототипами, нет?
|
Часовой пояс GMT +3, время: 11:37. |