Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализатор для объекта произвольного типа, существует ли синтаксис? 
:(
    Опции темы
Stampede
Дата 26.10.2005, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 4
Всего: 144



Вот есть такая удобная штука как инициализация объекта массивом свойств:

Код

var book = {title: 'Robinson Crusoe', author: 'Daniel Defoe'};


Отлично. А как мне теперь создать объест определенного типа и инициализировать его аналогичным образом. Например, элемент листбокса:

Код

var item = new Option( {text: 'Item One', value: 'item1', selected: true} );


Я попробовал так, как написал, но JS такого не понимает. Спинным мозгом чувствую, что должно быть решение - уж больно удобный способ создавать объекты из серверного скрипта. Кто подскажет?



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
DEER
Дата 26.10.2005, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



Код

 function Box(bodyText, width, height, left, top)    
 {    
   this.NewDiv = document.createElement("div");    
   document.body.appendChild(this.NewDiv);    
   var oNode = document.createTextNode(bodyText);    
   this.NewDiv.appendChild(oNode);    
   this.NewDiv.style.padding = "5px";    
   this.NewDiv.style.backgroundColor = "#eeeeee";    
   this.NewDiv.style.position = "absolute";    
   this.NewDiv.style.left = left+"px";    
   this.NewDiv.style.top = top+"px";    
   this.NewDiv.style.height = eval(height)+"px";    
   this.NewDiv.style.width = eval(width)+"px";    
 }    


Вот так можно создать новый DIV на странице,

В функцию createElement("div"), можно вписать имя и других объектов



--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Aliance
Дата 26.10.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Пишешь функцию-конструктор и вызываешь ее.
Объясни, чего ты хочешь получить - может не тем путем идешь?!
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 26.10.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Для начала, типов в JS нет, соответственно нет и классов. Есть конструкторы что привёл DEER, но конструктор по сути ничем не отличаеться от внешней инициализации обьекта, т.е. obj.pole=90; из любой другой функции будет иметь тот же эффект что и из под конструктора.

Во вторых "инициализация объекта массивом свойств" - это не совсем верное определение. Ты создаёшь новый литеральный обьект, конструктором которого будет Object(поясню позже), изменив прототип полученного обьекта ты приведёшь его "к типу", т.е. к связи "он есть что-то", что важно в конструкции instanceof(поясню позже).

Читаем мою тему о прототипах и т.д., врубаемся что любая функция может быть конструктором.

Любой обьект имеет поле constructor указывающее на функцию-конструктор. Это верно для всех обьектов (кроме ИЕ, в нём html обьекты вроде как не имеют конструкторов). Кто конструктор обьекта по большому счёту не важно, но может быть полезно если обьект этого сам не знает и хочет сделать себе подобного.

Понятие прототип обьекта это одна из основ JS. Несколько понятий заранее:
  • в JS нет типов, следовательно нет классов, любой обьект может стать любым другим обьектом в любое время, т.е. его instanceof конструкция может поменяться. У людей с OOP only мышлением возникает ассоциация со сменой типа.
  • нет жёстких интерфейсов обьектов, любой обьект, от какого бы конструктора он не произошёл, может изменить свой (или его могут изменить извне) интерфейс на любой другой в любое время. Это большя свобода, которой нужно уметь пользоваться, а то можно выстрелить себе в ногу smile
  • у обьектов нет методов, впрочем и функций тоже нет. Любая функция (кусок кода) это closure, т.е. сохранение контекста определения и т.д. всё это есть. Любой метод обьекта это closure записанный в поле обьекта, т.е. обьект имеет только поля, а closures это обьекты(порождённые от Function), как и любые другие сущности языка.
  • интерфейс обьекта складываеться из: личного интерфейса + интерфейса прототипа конструктора
  • прототип конструктора содержит обьект порождённый от конструктора, но бе инициализации личного интерфейса (т.е. без this.чтото устанавливаемом в конструкторе).
Быть может мозгодробильно, но нужно это понять smile

Теперь подумаем над вопросом:
Цитата(Stampede @ 25.10.2005, 23:12)
А как мне теперь создать объест определенного типа и инициализировать его аналогичным образом. Например, элемент листбокса:

Конструктор в Option нам не изменить и не переопределить, т.к. это обьект окружения(браузер). Тогда припишем ему свой init метод, который и отработает детали.
Код
Option.prototype.init=function(d) {
  for(i in d) {
    if(d[i] instanceof Function) continue;
    this[i]=d[i];
  }
}

a=new Option();
a.init({text: 'Item One', value: 'item1', selected: true});
alert(a.value);

И тут опять убеждаемся в отстойности интерпретатора JS в ИЕ, в нём встроенные html обьекты "типа понарошку", к прототипу не подобраться. Следовательно нельзя, допустим для элемента div определить свои методы/поля, т.е. определить свой интерфейс. Естественно это всё возможно в Мозилле и Опере.

В итоге пишем отдельную функцию где инициализируем похожим способом обьект Option.

Обьяснил подробно, т.к. помню тебе было интересно smile А по вопросу пиши литеральные обьекты, по которым создашь свои Option после, сразу инициализировать обьект не получиться.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Stampede
Дата 26.10.2005, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 4
Всего: 144



Все понял, всем спасибо.

Цитата(Sardar @ 26.10.2005, 14:09)
А по вопросу пиши литеральные обьекты, по которым создашь свои Option после, сразу инициализировать обьект не получиться.


Я, кстати, так сперва и делал, а потом подумал, может Options можно создавать напрямую? Теперь понятно, что для этого можно написать свою функцию инициализации, но как-то это... некошерно smile Как-то уж сильно по-ФОПовски.

Так что пока обойдусь литеральными объектами.

PM WWW   Вверх
Zeroglif
Дата 26.10.2005, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Stampede

Встроенный конструктор new Option(text, value, defaultSelected, selected) не подходит? Создаёшь объект и пуляешь его в массив options нужного селекта.

Код

document.getElementById('sel').options[0]=new Option('текст','вэлью',false,false);


Если не подходит, то, как сказали ранее, энными DOM-овскими методами, предварительно подготовив нужные свойства для option.
PM MAIL WWW   Вверх
Stampede
Дата 26.10.2005, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 4
Всего: 144



Цитата(Zeroglif @ 26.10.2005, 20:00)
Встроенный конструктор new Option(text, value, defaultSelected, selected) не подходит?


Почти подходит, но у меня с элементами списка сассоциированы еще и мои собственные custom properties. Кстати, щас обнаружил, что присвоить их можно, но при клонировании они не передаются.

Ничо, поправил, уже все мослает как по маслу smile

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.