Javascript.RU

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

Сообщение от krutoy
Но тогда экземпляры FormFiled, будут ссылаться на FormFile
тут моя ошибка, нужно примерно так:
function FormField(data) {
  this._d = data;
}
   
function FormFile(data, opts) {
  FormField.call(this, data);
  this.opts = opts;
}
   
FormFile.prototype = Object.create(FormField.prototype);
FormFile.prototype.constructor = FormFile;
   
o=new FormField()
console.log(o.constructor); // [Function: FormField]

o=new FormFile()
console.log(o.constructor); // [Function: FormFile]
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #22 (permalink)  
Старый 24.11.2014, 22:25
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

devote,
Печально все таки, что эти гребаные комитетчики ломают язык. Если бы __proto__ не было deprecated, можно было бы обойтись без бубнов
function FormField(data) {
  this._d = data;
}
    
function FormFile(data, opts) {
  FormField.call(this, data);
  this.opts = opts;
}
    
FormFile.prototype.__proto__=FormField.prototype
    
o=new FormField()
console.log(o.constructor); // [Function: FormField]
 
o=new FormFile()
console.log(o.constructor); // [Function: FormFile]

//  [Function: FormField]
//  [Function: FormFile]

Одна надежда -- на setPrototypeOf. Я надеюсь, она будет обладать функциональными возможностями __proto__?
Ответить с цитированием
  #23 (permalink)  
Старый 24.11.2014, 22:49
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

krutoy, на здоровье
/**
 * Inherits a target (Class_1) from a source (Class_2)
 * @param {Function} target
 * @param {Function} source
 */
function inherit(target, source) {
    target.prototype = Object.create(source.prototype);
    target.prototype.constructor = target;
    target.super_ = source;
}

// ---------------------

function FormField(data) {
    this._d = data;
}

// -------------------------

inherit(FormFile, FormField);

function FormFile(data, opts) {
    FormFile.super_.apply(this, arguments);
    this.opts = opts;
}

// -------------------------

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);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #24 (permalink)  
Старый 24.11.2014, 23:06
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

nerv_,
Это можно и проще сделать
Object.prototype.extend=function(src){
   for(var i in src){if(i in this) continue; this[i]=src[i]}
}

function FormField(data) {
  this._d = data;
}
    
function FormFile(data, opts) {
  FormField.call(this, data);
  this.opts = opts;
}
    
FormFile.prototype.extend(FormField.prototype)
    
o=new FormField()
console.log(o.constructor); // [Function: FormField]
 
o=new FormFile()
console.log(o.constructor); // [Function: FormFile]

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

Сообщение от krutoy
Это можно и проще сделать
это уже не наследование а копирование свойств.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #26 (permalink)  
Старый 24.11.2014, 23:25
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

devote,
Да, ступил, извиняюсь.
Ответить с цитированием
  #27 (permalink)  
Старый 24.11.2014, 23:44
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

devote,
Вот так, кажись, можно
Object.prototype.inherit=function(parent){
    var o = Object.create(parent.prototype)
    o.constructor=this.prototype.constructor
    this.prototype=o
}

function FormField(data) {
  this._d = data;
}
    
function FormFile(data, opts) {
  FormField.call(this, data);
  this.opts = opts;
}
    
FormFile.inherit(FormField)
    
o=new FormField()
console.log(o.constructor); // [Function: FormField]
 
o=new FormFile()
console.log(o.constructor); // [Function: FormFile]
Ответить с цитированием
  #28 (permalink)  
Старый 25.11.2014, 00:12
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

krutoy,
да, все это сахар конечно
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #29 (permalink)  
Старый 25.11.2014, 07:19
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

devote, получается вроде наоборот. После

FormField.call(this, data);

вся тряхомудия FormFile будет перезаписана, или я все еще туплю. Общий чертеж как сейчас работает.

function FormField(elem){
 var // из елемента достаются всякие атрибуты единовременно
  ;

 return {
   elem:elem,
   validate:function(event){if(type in rules)//...},
   update:function(value){elem.value=value},
 }

}

function FormFile(elem){
 var // из елемента достаются всякие атрибуты единовременно
  ;

 return {
   elem:image_list,
   validate:function(){// тут все голимо, ибо такое поле обычно одно, ну или 2, х с ним},
   update:function(html){image_list.innerHTML=html;},
 }

}

// по change и input формы вызывается внешнее управление
var validate = function(event){
  var elem=event.target;
  try{
    if(elem.name && elem.name in inputs) // inputs - это коллекция тех самых
       inputs[elem.name].validate(event);
  }
  catch(err){
   // еррор хендлер, в частности
   inputs[name].elem.classList.add('invalid');
  }
};

// по onload xmlhttprequest еще раз внешнее управление
for(var name in data)
   inputs[name].update(data[name]);


Ну вот, так сейчас я сделал, все блин работает, почему - не понятно. То есть понятно - за счет особенности js грести под методы и кложи контекст. В терминах php хрень непостижимая. Вероятно и не надо тут пытаться воспроизвести классическое наследование. Те же задачи решаются просто в другой плоскости.

То есть у меня 2 как бы объекта с одинаковым интерфейсом. При чем про свой этот интерфейс объекты не знают, ибо он снаружи, а внутри чисто приватные переменные, которые загружаются из контекста. Чтобы до них добраться снаружи нужен getter, чтобы им присваивать нужен setter. Я почитал что вещь довольно новая и как-то не рискнул.

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

НИпотеме. А вот в php сеттеры и геттеры это капец какая халява. Это же еба...шся проверять isset'ом туевую хучу пропертей в рендере. Ну вот, делается 1 геттер типа

protected function __get($name){
  if(array_key_exists($name,$this->_d))
    return $this->_d[$name];
  else
    return null;
}


и потом значит повсюду if($this->value), или там if($name=$this->name).

Как обычно в бочке - ложка: нормально нельзя получить референс через геттер и нельзя присвоить значение элементу массива в такой вот недоступной переменной, которая array. Если же все это николебет - то голимая лафа.

А вот писать везде if(typeof some_var === 'undefined') меня уже подзаебало. JS же в упор не хочет отвечать за вложение больше 1 глубиной. На php if(isset(arr['one']['two']['three']['four']))... на js - х нанэ. Или как-то делается?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить на 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