Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.11.2014, 09:23
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Еще один тупой вопрос по наследованию
В 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);

и там профтыкаю все нормально, то, дальше не пойму что делать. У этих двух объектов кроме перечисленных пропертей - ничего общего.
Ответить с цитированием
  #2 (permalink)  
Старый 24.11.2014, 09:27
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Если сначала сделать безымянный объект

var obj={
elem: elem,
error: error,
//...
}

то как его расширить методами которые как объект-же возвращают перечисленные "классы", то есть это функции

var FormFile = function(opts,progress){
  // внутренности
 return {
  // наружности
 };
};
Ответить с цитированием
  #3 (permalink)  
Старый 24.11.2014, 12:04
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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 }
Ответить с цитированием
  #4 (permalink)  
Старый 24.11.2014, 12:30
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Переписать проперти по-одной я знаю как. Но в php я ничего не переписываю. Выше нарисовано как это происходит - массив с данными передается родителю, а тот кладет их в свою приватную переменную и - добавляю теперь - выдает через геттер по требованию. Если без геттера, то он бы их просто выжал (extract) в свой this и естественно этот this стал бы this для наследника.

Метафора классического наследования в программировании - целлулоид. Например есть абстрактный класс с чертежом. На этот класс кладется целлулоид и по нему рисуются детали, фон, кое-что полностью перерисовывается. Затем на этот целлулоид кладется следующий целлулоид, который заменяет или модифицирует часть, добавляет еще деталей, цвета, формы итд. Пачка целлулоидов формирует картину. В ран-тайм - анимацию.

Так вот жаба-наследование не классическое и метафора у него типа участок электрической цепи с индукцией на свои проперти. Я ее не могу осилить до сих пор.
Ответить с цитированием
  #5 (permalink)  
Старый 24.11.2014, 12:37
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Не приватную - 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

Последний раз редактировалось kostyanet, 24.11.2014 в 12:50.
Ответить с цитированием
  #6 (permalink)  
Старый 24.11.2014, 12:58
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

В php главная задача рендерить контент, поэтому из строки массива делается объект, который сам себя рендерит и коллекция сама себя рендерит, в итоге там где хочется просто пишешь echo $this->form; и вся эта тряхомудия в мгновение ока превращается в голимую кучу хтмля.

В js такой задачи у меня нет, но именно долбаное поле file требует рендера и поэтому я подумал что надо просто сделать так же, как в php и будет работать. Оно работает, но через жопу. То есть приватные методы нихера не знают про все эти проперти, потому что они торчат наружу, а как их внутрь завести я еще не понял.
Ответить с цитированием
  #7 (permalink)  
Старый 24.11.2014, 13:16
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от kostyanet
Метафора классического наследования в программировании - целлулоид. Например есть абстрактный класс с чертежом. На этот класс кладется целлулоид и по нему рисуются детали, фон, кое-что полностью перерисовывается. Затем на этот целлулоид кладется следующий целлулоид, который заменяет или модифицирует часть, добавляет еще деталей, цвета, формы итд. Пачка целлулоидов формирует картину. В ран-тайм - анимацию.
Описанная тобой модель примитивна до безобразия
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 ]

Сообщение от kostyanet
жаба
При чем тут жаба?
Сообщение от kostyanet
типа участок электрической цепи с индукцией на свои проперти
Я че то не понял твоей аналогии. Можешь расшифровать?

По сабжу: PHP не знаю, поэтому код твой не понимаю. Описание задачи -- тоже мутное. Может быть, если бы ты описал задачу максимально абстрактно, я бы мог тебе помочь, если бы смог понять, что ты хочешь.
Ответить с цитированием
  #8 (permalink)  
Старый 24.11.2014, 15:47
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Я не понимаю зачем вы тогда отвечаете если не понимаете.
Ответить с цитированием
  #9 (permalink)  
Старый 24.11.2014, 16:44
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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);
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #10 (permalink)  
Старый 24.11.2014, 16:45
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Конструктор не должен быть enumerable.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16
Ещё один PINQ Kfuse Ваши сайты и скрипты 21 07.05.2010 12:50
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37
Еще один вопрос по setTimeout setInterval Хранитель Света Общие вопросы Javascript 5 12.03.2009 22:37
Еще один вариант плавно раскрывающегося дива (экспандер, спойлер) Alekson Ваши сайты и скрипты 0 23.12.2008 03:01