Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП - перебор объектов и применение к ним метода (https://javascript.ru/forum/misc/71032-oop-perebor-obektov-i-primenenie-k-nim-metoda.html)

wadim 20.10.2017 15:07

ООП - перебор объектов и применение к ним метода
 
Всем привет! Как создать много объектов, к примеру 10 000. Написал так:

function Car()
{
var newCar = {}

this.honk = function()
{
document.write("Би-бип");
}


return this;
}




myCar= [];
myCar[]= new Car();


myCar[0].honk();

Второй вопрос как применить к массиву объектов метод? Возможно я не правильно полностью написал код, как правильно?
Вообще мне нужно сделать известную игру "шарики" и Car() просто для примера. На ООП хочу реализовать вывод клеток, каждая клетка объект, вопрос как объявить столько объектов? Мое решение: for (...) myCar[i]= new Car();
Дальше возникла проблема с вызывом метода отрисовки клетки.

Nexus 20.10.2017 15:18

wadim, Создать 10к экземпляров объекта можно в цикле, либо вручную.
Вызвать метод "honk" всех объектов массива myCar сразу нельзя, нужно пробежаться по элементам массива в цикле и вызвать для каждого объекта массива этот метод.

PS. Можно расширить прототипа объекта Array, добавив в него новый метод, который будет это реализовывать.

wadim 20.10.2017 15:24

Nexus напишите пожалуйста как? 10к создаю: for (...) myCar[i]= new Car(); Правильно? Я даже к одному объекту обратится не могу: myCar[0].honk();
Не работает!

Dilettante_Pro 20.10.2017 15:35

Как это не работает?
<script>
function Car()
{
   var newCar = {} 
   this.honk = function()
   { 
      document.write("Би-бип<br>");
   }
   return this;
}

myCar= [];
for (var i = 0; i<10; i++) {
   myCar[i]= new Car();
}

myCar[0].honk();
myCar[9].honk();

myCar.bang = function() { document.write("Ба-бах<br>");}
myCar.bang();

</script>

wadim 20.10.2017 15:51

Dilettante_Pro спасибо. Странно что не работает: myCar[]= new Car(); Почему? Тот код, что написал Dilettante_Pro, мне просто пришел на ум, в интернете не нашел подобное. Вопрос, правильно ли я понимаю ООП? Правильно ли такое решение(код реализованный Dilettante_Pro)? Ну и наконец, подходит ли для решения моей задачи - игры "Шарики"?

Dilettante_Pro 20.10.2017 16:04

wadim,
Что такое myCar[] ? Массив? Элемент массива?

Alexandroppolus 20.10.2017 16:08

Цитата:

Сообщение от Nexus
Можно расширить прототипа объекта Array, добавив в него новый метод

это считается антипаттерном.

в прототипы стандартных объектов можно добавлять только полифилы.

Nexus 20.10.2017 16:18

Цитата:

Сообщение от Alexandroppolus
это считается антипаттерном.

Но реализовать-то таким образом можно.

Я думаю тс так делать не станет, это будет банально неудобно.
Если нужно сделать подобное, то лучше реализовать новый класс, который будет наследовать прототип от Array.

wadim 20.10.2017 16:32

myCar[]=1; - это я думаю не будет работать на js, а так $myCar[]=1; - на php без проблем.

Nexus 20.10.2017 16:39

wadim,
$myCar[]=1;//PHP
==
myCar.push(1);//JS

ruslan_mart 21.10.2017 00:28

Объявлять метод внутри конструктора - плохая практика.

function Car() {
	//...
}

Car.prototype.honk = function() {
	console.log('Би-бип');
};

var myCars = [];

for (var i = 0; i < 10; i++) {
	myCars.push(new Car);
}


myCars.forEach(function(car) {
	car.honk();
});

Vlasenko Fedor 21.10.2017 01:02

Цитата:

Сообщение от Alexandroppolus
в прототипы стандартных объектов можно добавлять только полифилы.

Плевать на это дело.
Когда то писали что стили надо в header только подключать
Теперь фреймворки их налету подгружают динамически
Если есть возможность расширить стандартный прототип и это не отразится в дальнейшем, то все ваши стереотипы в задницу
И не надо говорить, что это вчерашний день, про решения которые работают и успешно справляются с своими задачами

Alexandroppolus 21.10.2017 03:57

Цитата:

Сообщение от Poznakomlus
Когда то писали что стили надо в header только подключать
Теперь фреймворки их налету подгружают динамически

Ну и что? Добавляют ведь всё равно в head.

Цитата:

Сообщение от Poznakomlus
Если есть возможность расширить стандартный прототип и это не отразится в дальнейшем

А если отразится? Тогда что?
Прототип стандартного объекта - это глобальная область, такая же как window. Думаю, не надо объяснять, почему не следует раскидывать по глобальной области своё барахлишко. К тому же с каждым новым стандартом es в этих прототипах куча всего добавляется.

Vlasenko Fedor 21.10.2017 13:34

Цитата:

Сообщение от Alexandroppolus
Добавляют ведь всё равно в head.

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

Цитата:

Сообщение от Alexandroppolus
А если отразится

Значит вы не контролируете процесс
И если говнокодите, то разницы нет с глобал или без
С ним также стоит уметь работать для этого есть и модули и неймспейсы которые экспортируют в него же.
Небольшой пример с forEach, 2 строки :lol:
<div></div>
<div></div>
<div></div>
<script>
HTMLCollection.prototype.forEach = NodeList.prototype.forEach = Array.prototype.forEach;
document.querySelectorAll('div').forEach((el, i) => el.insertAdjacentHTML('afterbegin', ++i));
</script>

Alexandroppolus 21.10.2017 20:41

Цитата:

Сообщение от Poznakomlus
нет разницы, можете в body вставлять, динамически включенные скрипты подгружаются асинхронно без блокировки основного потока

так скрипты или стили? стили раньше можно было только в head втыкать, иначе они не подхватывались. А скрипты всегда работали и в боди.

Цитата:

Сообщение от Poznakomlus
Небольшой пример с forEach, 2 строк

пример, безусловно, интересный. Только бесполезный. В NodeList.prototype и так есть forEach. В старых браузерах нет, вот и получается полифил.
В следующий раз, замышляя потрясти оппонента эффектным примером, извольте для начала в справочник заглянуть. :) А то ведь может оказаться, что метод с таким названием в прототипе уже есть, только работает чуть по другому )

Vlasenko Fedor 22.10.2017 01:39

Цитата:

Сообщение от Alexandroppolus
В старых браузерах нет

нет его реализация не во всех браузерах до сих пор
https://developer.mozilla.org/en-US/...deList/forEach
Цитата:

Сообщение от Alexandroppolus
отрясти оппонента эффектным примером

под столом катаюсь:lol: , написал, что попалось под руку
Цитата:

Сообщение от Alexandroppolus (Сообщение 467919)
А то ведь может оказаться, что метод с таким названием в прототипе уже есть, только работает чуть по другому )

Кто первый того и тапочки, если мне нужна реализация и она работает

ruslan_mart 22.10.2017 01:51

Не вижу ничего плохого в расширении прототипов. Сам так делаю и не парюсь, зато удобно. А если опасаетесь, что в будущем могут быть какие-то проблемы из-за того, что названия новых методов будут совпадать с вашими, то никто Вам не мешает называть свои методы с каким-нибудь префиксом (типа $forEach, _forEach, flyForEach), так как вряд ли методы нативной реализации будут с подобными префиксами.


Часовой пояс GMT +3, время: 19:51.