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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объекты и массивы. Пользовательские объекты в JavaScript. 
:(
    Опции темы
Aliance
Дата 27.1.2005, 20:08 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


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

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



Для начала хочу настроить вашу голову так, чтобы Вы не смешивали объекты в JS с объектно-ориентированным программированием.
Объект в JS нужно рассматривать как контейнер для данных, в котором каждая запись имеет название для более удобного использования.
Например, если сценарий часто обращаеться к одним и тем же глобальным переменным, есть смысл организовать эти данные в объект.

В JS нередко путаються 2 понятия: массив и объект. Итак, что это такое и когда же нужно использовать массив, а когда объект?!
Массив следует рассматривать как пронумерованный список, самоопределящий назначение данных, хранящихся в нем.
( например, список Ваших CD )
Положение данных относительно друг друга не играет главенствующую роль.
Например, может возникнуть необходимость отсортировать список, вывести опр. элемент массива и т.п.
Таким образом, массив требуется для перебирания всех элементов массива для посл. действий с ними.
Объект же служит для совмещения данных одной категории.
( например, 1 св-во - CD.name, 2 св-во CD.author и т.п.
Т.е. 1 св-во будет, скажем, содержать имя диска и его фирму-изготовителя, второй же - автора)

каждое свойство объекта имеет свое имя, для получения доступа к информации этого объекта по этому свойству.
( Т.е. cd.author может содержать инфу об авторе данного диска )

Применение объектов позволяет сценарию просматривать отдельные св-ва элементво списка.
( например, имея объект CD можно просматривать весь список, составляя перечень дисков, чьи авторы удоволетворяют неким требованиям)

Для того, чтобы создать объект для хранения структыры данных нужно написать следующий код в Вашем сценарии:
(существует полный и сокращенный синтаксис, разберем оба)

Код

/* Для создания объекта используеться ключевое слово new */ 
var CD1 = new disk("CS", "Half-Life");
var CD2 = new disk("Commandos", "Eidos");
/* Создание функции для назначения свойствам объекта некого значения */
function disk (name, author) {
   this.name = name;
   this.author = author;
}
/* Не забудьте ключевое слово this, т.к. функция disk() служит для создания нескольких объектов */

/* ================================== */

/* сокращенный синтаксис (IE4+ & NN4+) */
var CD1 = {name:"CS", author:"Half-Life"};
var CD2 = {name:"Commandos", author:"Eidos"};
/* строковые данные помешаются в кавычки, числовые без */

/* Обращаться к ним можно так же, как и ко многоим другим свойствам любого объекта в JS */
alert("Компания " + CD1.author + " выпустила игру " + CD1.name + ".");
/* Данное диалоговое окно выдаст: «Компания Half-Life выпустила игру CS.» */


Так же таким кодом можно добавлять новые свойства со своими данными в уже заданный объект:
CD1.fullName = "Counter-Strike";
После такого присваения только у объекта CD1 появиться св-во fullName.

Так же можно (но не рекомендуеться) задавать объект без свойств и сразу же добавлять их:
var DVD = new Object();
DVD.name = "bla";
DVD.author = "bla";


Так же можно добавить к свойству метод. Для этого нужно предварительно описать метод как функцию, после чего присвоить ссылку на нее методу объекта.

Код

function show_author() {
alert("Компания " + this.author + "выпустила игру " + this.name + ".");
}

function disk (name, author) {
   this.name = name;
   this.author = author;
   this.show = show_author;
}

var CD1 = new disk("CS", "Half-Life", show:show_author);
var CD2 = new disk("Commandos", "Eidos", show:show_author);

/* Теперь для выполнения метода, вызываем его у любого из его объектов: */
CD1.show();
/* или */
CD2.show();


Если при вызове конструктора объекта disk опустить одно из его параметров (числовой), то в этом поле будет помещено значение null.
Такое поведение не всегда подходит, и было бы удобнее инициализировать это поле нулем, делается это так:

Код

function number (someNumber) {
   this.someNumber = someNumber || 0;
}


Таким образом если мы упустим строчку
var someNumber = new number(123);
, то в свойство запишеться второе значение параметра, т.е. 0.

У полной формы записи конструктора есть одно преимущество: можно вызывать методы объекты и функции еще при конструировании. Смотрим ниже:

Код

function validate(obj) {
alert("Был создан объект " + obj.name + ".");
}

function disk (name, author) {
   this.name = name;
   this.author = author;
   this.show = show_author;
   validate(this);
}


Сочетание объектов и массивов (массив из объектов, сокр. синтаксис):

Код

var people = [{name:"a", author:"aa", age:20},
              {name:"b", author:"bb", age:21},
              {name:"c", author:"cc", age:22},
              {name:"d", author:"dd", age:23},
              {name:"e", author:"ee", age:50}];


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

Код

function find(nim, max) {
   var result = newArray();
   for (var i = 0; i < people.length; i++) {
      if (people[i].age >= min && people[i].age <= max) {
         result = result.concat(people[i].name);
      }
   }
   return result;
}


Дополняем и критикуем, спрашиваем и попровляем :-) smile

Это сообщение отредактировал(а) Aliance - 10.4.2006, 14:01
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 28.1.2005, 18:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата(Aliance @ 27.1.2005, 19:08)
Массив следует рассматривать как пронумерованный список, самоопределящий назначение данных, хранящихся в нем.

Массивы и обьекты в JS реализованны хеш-таблицами, хотя сами данные массива могут быть сохраненны в связанном списке - всё зависит от реализации и для конкретного скрипта полностью прозрачно. Массив ведёт свою длинну, например:
Код
var a=["a"];
a.length=10;
alert(a); //  выведет: а,,,,,,,,,


Цитата(Aliance @ 27.1.2005, 19:08)
Объект в JS нужно рассматривать как контейнер для данных,

В корне не согласен с этим утверждением. Обьекты полноценные элементы языка, они позволяют программировать в обьектном(не путать с ООП) стиле. Хорошая дискуссия была здесь: http://forum.vingrad.ru/index.php?showtopic=31547

Коротко: обьекты могут наследовать друг друга, у обьектов одного конструктора и наследников может быть одинаковый общий интерфейс описанный в prototype. "Может быть" - потому как любое свойство обьекта можно в любое время удалить/изменить/добавить. У обьектов есть приватные поля и методы(функции), хотя к приватным как это сделанно в Java их относить нельзя, всё работает немного по другому.

Цитата(Aliance @ 27.1.2005, 19:08)
существует полный и сокращенный синтаксис,

Сокращённый синтаксис порождает обьекты от Object, что нам докажет оператор instanceof. В то время как обьект порождённый конструктором будет также относится к типу этой функции. Через поле prototype этой функции можно воздействовать на все обьекты порождённые от неё.

Тема еще не до конца раскрыта, вообще она сама по себе обширна smile
В любом случае выведем заключение: на JS можно писать как в структурном стиле, так и в стиле ООП. Обьекты это нечто большее чем структуры или классы, ибо типов в JS нет. Обьекты успешно могут использоватся как хешь таблицы.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 3.3.2006
Где: http://www.angeli na-pitt.by.ru

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



Aliance, статья хорошая но больше посвящена объектам нежели массиву... Но все-равно очень и очень поучительно!! СПАСИБО!!!
PM MAIL WWW   Вверх
Aliance
Дата 27.3.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


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

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



Да незачто smile Скажем так, она не закончена. Посмотри на дату, когда я ее постил. На форуме не бываю с октября уже :-( Подготовка и сдача экзаменов smile
PM MAIL WWW ICQ Skype   Вверх
kaa
Дата 1.7.2007, 20:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А продолжение буит?!  smile  smile 
PM MAIL   Вверх
Zeroglif
Дата 2.7.2007, 23:59 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(kaa @  1.7.2007,  21:29 Найти цитируемый пост)
А продолжение буит?!

Проще задать вопрос или ряд вопросов в форуме, что именно (или приблизительно именно) по этой теме тебя интересует.
PM MAIL WWW   Вверх
cruelangel
Дата 12.9.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 8



>Обьекты полноценные элементы языка, они позволяют программировать в обьектном(не путать с ООП) стиле

и чем же объектный стиль программирования отличается от объектно ориентированого программирования? smile
PM MAIL   Вверх
JSman
Дата 17.9.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(cruelangel @  12.9.2007,  20:42 Найти цитируемый пост)
объектно ориентированого программирования

тем что ООП отличается от прототипного подхода ;)
PM ICQ   Вверх
Aliance
Дата 21.1.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


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

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



Недавно столкнулся с проблемой удаления произвольного элемента в массиве зная только его индекс.
Есть встроенный оператор delete, но он просто обнуляет элемент, не изменяя общей размерности массива.

Предлагаю вашему вниманию следующую функцию:
Код

Array.prototype.deleteItem = function( ind )
{
    if ( ind == 0 ) return this.shift();
    if ( ind == this.length - 1 ) return this.pop();
    var start = this.slice( 0, ind - 1 );
    var end = this.slice( ind, this.length );
    return start.concat( end );
}

var my_array = [ 0, 1, 2, 3, 4, 5, 6 ];

my_array.deleteItem(my_array.length-1);
// 0, 1, 2, 3, 4, 5
...
my_array.deleteItem(0);
// 1, 2, 3, 4, 5, 6
...
my_array.deleteItem(3);
// 0, 1, 3, 4, 5, 6


Так же часто возникает необходимость найти индекс соответствующего элемента в массиве, нечто вроде аналога php`шной функции array_search().

Предлагаю вам следующий код:
Код

Array.prototype.find = function( ind )
{
    var index = null;
    for ( var i = 0; i < this.length; i++ )
    {
        if ( this[i] == ind )
        {
            index = i;
            break;
        }
    }
    return index;
}

var t = [ 100, 200, 300, 400, 500 ];
alert( t.find(300) );
// вернет 2


Это сообщение отредактировал(а) Aliance - 21.1.2009, 15:24
PM MAIL WWW ICQ Skype   Вверх
Aliance
Дата 3.2.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


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

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



Собственно нашел аналогичную функцию в jQuery:
Код

$.inArray( what, where )


Вот её код:
Код

    inArray: function( elem, array ) {
        for ( var i = 0, length = array.length; i < length; i++ )
        // Use === because on IE, window == document
            if ( array[ i ] === elem )
                return i;

        return -1;
    },

PM MAIL WWW ICQ Skype   Вверх
BlackApricot
Дата 23.3.2010, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Недавно столкнулся с проблемой удаления произвольного элемента в массиве зная только его индекс.
Есть встроенный оператор delete, но он просто обнуляет элемент, не изменяя общей размерности массива




Так есть готовое, или я путаю, и речь о другом?

10. splice(индекс, количество [, элем1 [, элем2 [,...элемN]]])— удаляет из массива несколько элементов и возвращает массив из удалённых элементов или заменяет значения элементов.
Синтаксис:имя_массива.splice(индекс, количество [, элем! [, элем2 [,...элемМ]]])
Возвращает массив. Совместимость:IE5.5+. Данный метод изменяет исходный
массив.
Первые два параметра обязательны, а следующие — нет. Первый параметр является индексом первого удаляемого элемента, а второй — количеством удаляемых элементов.
Пример
а=new Array("Вася", "Иван", "Марья", 12, 5);
х=a.splice(1, 3);//вернёт х — массив элементов:"Иван", "Марья", 12
в массиве а - останется массив элементов:"Вася", 5
Метод splice() позволяет также заменить значения элементов исходного массива, если указаны третий и, возможно, последующие параметры. Эти параметры представляют значения, которыми следует заменить исходные значения элементов массива. При таком использовании метода splice() важен первый параметр(индекс), а второй(количество)может быть равным нулю. В любом случае, если количество элементов замены больше значения второго параметра, то часть элементов исходного массива будет заменена, а часть элементов будет просто вставлена в него. При этом метод splice() возвращает другой массив, состоящий из элементов исходного, индексы которых соответствуют первому и второму параметрам. Но это справедливо, если второй параметр не равен 0.
Пример
а=new Array("Вася", "Иван", "Марья", 12, 5);
х=а.splice(1, 3, "Пётр", "Кузьма", "Анна");
//вернёт х-массив элементов:"Иван", "Марья", 12
//вернёт а-массив элементов:"Вася","Пётр", Кузьма", "Анна",5
а=new Array("Вася", "Иван", "Марья", 12, 5);
х=a.splice(1, 0, "Пётр", "Кузьма", "Анна", "Фёдор", "Ханс");
//вернёт х-пустой массив
/*вернёт а-массив элементов:
"Вася", "Пётр", "Кузьма", "Анна", "Фёдор", "Ханс" */


Это сообщение отредактировал(а) BlackApricot - 23.3.2010, 06:03
PM MAIL   Вверх
Alexk553
Дата 4.3.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не забывайте о том, что при вызове splice происходит КОПИРОВАНИЕ всего массива. При вызове же цикла удаляется только то, что нужно. Если элементов в массиве немного, то нет разницы, но если в массиве 20 000 элементов, то разница может быть ощутима. То же касается и привлекательного на первфй взгляд метода shift. Пару дней назад я парсил текстовый файл из 20 000 строк, поленился писать внутренний цикл для операции слияния, использовал shift(). потом изумился "скорости" работы скриптика, переписал с использованием внутреннего цикла, быстродействие выросло в те самые 10 000 раз навскидку.
PM MAIL   Вверх
s0lman
Дата 30.1.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и лохматый
**


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

Репутация: нет
Всего: 29



Небольшой тест наглядно отображает, что ф-я выша работает на 72% медленнее. чем splice
http://jsperf.com/deleteitem-vs-split


--------------------
Когда я уже выучусь на волшебника? :(
PM   Вверх
webguru
Дата 10.9.2017, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот нашел хороший мануал по методам на перебор массива  http://webdiz.com.ua/osnovy-javascript/met...erebora-massiva
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




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


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

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