Цитата:
|
DjDiablo,
У нас на работе, к сожалению, добрая половина так думает. А потом когда смотришь в то, что он наделали, руки хочется поотрывать. |
monolithed,
Ну а чё в ЛС? :) Я тоже хочу может. |
Цитата:
п.с. ты видимо перед этим не думал месяц целый над удобством этого чуда как это делал я)) ине придумывал все тщательно)) либо стырил решение у меня либо просто сам додумался до такого же и быстро ) но все ровно смотря на то как выглядит моя функция ты уже автоматически мог слизать её удобство))) но возможно ты этого и не сделал) короче показывай давай |
Цитата:
ну и задание того требует, чтобы код был ООП-шным. Цитата:
вдохновлялся кодом Class из мутулз. Цитата:
да, её надо причесать.. но она мне нужна вот чисто в текущем проекте - я хочу писать в функциональном стиле. function Class (descriptor) { var constructor = descriptor.__construct__ || function () {}; var parent = descriptor.__extends__ || {}; var static = descriptor.__static__ || {}; var i; if (typeof parent === "function") { parent = new parent(); } constructor.prototype = Object.create(parent); constructor.prototype.super = parent; constructor.prototype.constructor = constructor; for (i in descriptor) if (descriptor.hasOwnProperty(i)) { constructor.prototype[i] = descriptor[i]; } for (i in static) if (static.hasOwnProperty(i)) { constructor[i] = static[i]; } return constructor; } var Creation = new Class({ createdBy: "God", // см. этот метод в каждом классе и результат overrideMe: function () { return "Hello"; } }); var Animal = new Class({ __extends__: Creation, lives: true, overrideMe: function () { return this.super.overrideMe() + ", "; } }); var Cat = new Class({ __construct__: function (name) { alert("Создана кошкэ"); this.name = name; }, __extends__: Animal, __static__: { FAV_CAT_NAME: "пушок" }, meow: function () { alert(this.name + " : мяу"); alert("Унаследовал : " + this.createdBy); }, overrideMe: function () { return this.super.overrideMe() + "World!"; } }); var cat = new Cat( Cat.FAV_CAT_NAME ); cat.meow(); alert(cat.overrideMe()); |
Вот моя реализация, использую в текущем проекте :) И с миксинами.
https://github.com/NekR/Sync/blob/master/core.js#L41 |
melky,
а у тебя статик работают так var Cat = new Class({ __static__: { FAV_CAT_NAME: "пушок" }, }); Cat.FAV_CAT_NAME === new Cat().FAV_CAT_NAME // true ? Удобнее ли вот такой подход? var Cat = new Class( function( __static__ ){ __static__.FAV_CAT_NAME = "пушок"; } ); А так же вопрос, у тебя нет ни какой функции в описании, у тебя обьект описательный, то есть как бы нельзя делать в нем ни какие "действия" как в моей описательной функции. Например у меня в ней можно обьявлять как бы приватные вспомогательные функции которые не относятся к самому обьекту, но их используют методы этого обьекта. При том они не наследуются а наследуются только сами методы. Как это делается у тебя? var Cat = new Class( function () { this.__construct__ = function () { this.food = []; }; this.eat = function ( foodInstance ) { var suitabilityOfFood = _testSuitabilityOfFood( foodInstance ); if ( !suitabilityOfFood ) return false; this.food.push( foodInstance ); } // this вообще не используется, функция вспомогательная и не является методом объекта // по этому и не должна наследоваться. Начинается она с подчеркивания чтобы показать что это внутренняя функция // класса, то есть просто введя подчеркивание я сразу получаю в кодкомплите какие у меня вспомогательные // функции в этом классе есть. function _testSuitabilityOfFood( foodInstance ) { return foodInstance instanceof Food; } } ); Таким образом функция описатель представляет собой область видимости в которой мы можем вытворять че хотим. А у тебя бы нам пришлось относить такие вспомогательные функции либо К приватным методам, либо создавать их В САМИХ МЕТОДАХ на лету. ну то есть так var Cat = new Class( { eat:function ( foodInstance ) { // каждый раз создается function _testSuitabilityOfFood( foodInstance ) { return foodInstance instanceof Food; } var suitabilityOfFood = _testSuitabilityOfFood( foodInstance ); if ( !suitabilityOfFood ) return false; this.food.push( foodInstance ); }} ); |
Цитата:
if (parent) { if (!(this instanceof parent)) { self = Object.create(parent.prototype); } parent.apply(self, arguments); } handler.apply(self, arguments); return self; }; Цитата:
for (i in static) if (static.hasOwnProperty(i)) { constructor[i] = static[i]; } они не наследуются. смотри пример со статическим "вшитым" свойством : alert( "now" in Date ); // ну мы знаем, что это за метод такой. var myDate = new Date(); // создадим экземпляр alert( "now" in myDate ); // в экземпляре нету статического метода. Цитата:
Cat.prototype.foo = function ... Cat.prototype.bar = function .... и __static__ туда же : __static__.foo = ... __static__.bar = ... __static__.mar = ... каждый раз повторять одно и то же неохото, поэтому я сделал всё через хеши. Цитата:
данная функция просто позиционируется как укорачиватель действий\букв, которые тратятся впустую при обычном прототипном программировании. не более и я в них я не вижу смысла, т.к. я сам эти "приватные" переменные (с "_" в начале имени свойства) уж точно не запорю, а внешний код в них тоже не сможет вмешаться - все экземпляры подчиняются одному ( класс App ), который является контроллером, и управляет доступом к объектам сам. Цитата:
|
macdack,
блин, ещё один Flixabi:-/ |
Цитата:
Cat.FAV_CAT_NAME === new Cat().FAV_CAT_NAME // true ? статические свойства доступны только из конструктора или еще из самого инстанса? Цитата:
Кстати я понимаю у нас разные цели, но для ООП чье кунфу круче твое или мое)? мой Class или твой)? Только обьективно сравни) а так же скорость исполнения)) То есть если не использовать навороты которые есть у меня, а использовать на обеих функциях одно и то же) то где будет удобнее и быстрее)? |
Часовой пояс GMT +3, время: 03:49. |