|
Еще один тупой вопрос по наследованию
В js была каша, по остаточному принципу как всегда заваривается. Пришла пора разобрать все, и оказалось что у меня не хватает тямы это сделать.
В php есть коллекция (объект) ActiveForm в которую собираются объекты полутора классов: FormField - для вообще полей; и FormFile extends FormField - для файловых. В субклассе FormFile входящие данные модели тупо отсылаются в конструктор родителя parent::__constuct($data); Ну и затем свои проперти-методы добавляются и отчасти перезаписывают родительские. Все чики-пуки. В JS у меня пока что вот так получается: if(type=='file') var obj=FormFile(opts,progress); else var obj=FormField(); obj.elem= elem; obj.error= null; obj.index= index; obj.type= type; obj.title= elem.title; // тут еще куча пропертей Если я выдам условно родительскому объекту element var obj=FormField(element); и там профтыкаю все нормально, то, дальше не пойму что делать. У этих двух объектов кроме перечисленных пропертей - ничего общего. |
Если сначала сделать безымянный объект
var obj={ elem: elem, error: error, //... } то как его расширить методами которые как объект-же возвращают перечисленные "классы", то есть это функции var FormFile = function(opts,progress){ // внутренности return { // наружности }; }; |
kostyanet,
Я нихнепонел, но предположу, что тебе надо что-то типа: O=function(){} O.prototype.extend=function(src){ for(var i in src){this[i]=src[i]} return this } fu=function(o){ return function(src){return o.extend(src)} }(new O) alert(fu({a: 1})) alert(fu({b: 2})) // { a: 1 } // { a: 1, b: 2 } |
Переписать проперти по-одной я знаю как. Но в php я ничего не переписываю. Выше нарисовано как это происходит - массив с данными передается родителю, а тот кладет их в свою приватную переменную и - добавляю теперь - выдает через геттер по требованию. Если без геттера, то он бы их просто выжал (extract) в свой this и естественно этот this стал бы this для наследника.
Метафора классического наследования в программировании - целлулоид. Например есть абстрактный класс с чертежом. На этот класс кладется целлулоид и по нему рисуются детали, фон, кое-что полностью перерисовывается. Затем на этот целлулоид кладется следующий целлулоид, который заменяет или модифицирует часть, добавляет еще деталей, цвета, формы итд. Пачка целлулоидов формирует картину. В ран-тайм - анимацию. Так вот жаба-наследование не классическое и метафора у него типа участок электрической цепи с индукцией на свои проперти. Я ее не могу осилить до сих пор. |
Не приватную - protected, конечно.
Вкратце как на php более конкретно (чертеж) // в методе коллекции $data=$model->columns(); foreach($data as $name=>$col) { if($col['type']=='file') $this->_d[$name]= new FormFile($col,$model->file_options()); else $this->_d[$name]= new FormField($col); } // в файлах class FormField { protected $_d=array(); public function __construct($data){ $this->_d=$data; } } class FormFile extends FormField { private $opts=array(); public function __construct($data,$opts){ parent::__construct($data); $this->opts=$opts; } } вопрос - как сделать такое же на js |
В php главная задача рендерить контент, поэтому из строки массива делается объект, который сам себя рендерит и коллекция сама себя рендерит, в итоге там где хочется просто пишешь echo $this->form; и вся эта тряхомудия в мгновение ока превращается в голимую кучу хтмля.
В js такой задачи у меня нет, но именно долбаное поле file требует рендера и поэтому я подумал что надо просто сделать так же, как в php и будет работать. Оно работает, но через жопу. То есть приватные методы нихера не знают про все эти проперти, потому что они торчат наружу, а как их внутрь завести я еще не понял. |
Цитата:
def=Object.create o={a: 1} o1=def(o) o1.b=2 o2=def(o1) o2.c=3 alert([o2.a, o2.b, o2.c]) // [ 1, 2, 3 ] Цитата:
Цитата:
По сабжу: PHP не знаю, поэтому код твой не понимаю. Описание задачи -- тоже мутное. Может быть, если бы ты описал задачу максимально абстрактно, я бы мог тебе помочь, если бы смог понять, что ты хочешь. |
Я не понимаю зачем вы тогда отвечаете если не понимаете.
|
function FormField(data) { this._d = data; } function FormFile(data, opts) { FormField.call(this, data); this.opts = opts; } FormFile.prototype = FormField.prototype; FormFile.prototype.constructor = FormFile; var a = new FormFile(1, 2); var b = new FormFile(10, 22); console.log(a, a instanceof FormField, b instanceof FormField); console.log(b, a instanceof FormFile, b instanceof FormFile); |
Конструктор не должен быть enumerable.
|
Часовой пояс GMT +3, время: 20:19. |
|