Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

nikolay.dimov83 avatar nikolay.dimov83 143 Точки

Javascript OOP - Object Keys()

Здравейте банда, Боря се с една задача от стари домашни по Javascript OOP - да се създаде API за чертане на геометрични фигури върху canvas. Накратко имам 3 типа класове - един с различните геометричните фигури, един който пази масива от нарисувани на канваса фигури, управлява логиката на визуализация на тези фигури, логиката на user инпута и инициализацията на канваса. Третия не е клас, а са по - скоро няколко насипни event listeners. Едно от заданията е на всяка фигура начертана на канваса е да се логнат нейните properties със съответните values. Тъй като различните типове фигури имат различни properties, а техните начертани instances се пазят в масив от фигури, реших, че най-лесно ще е да достъпя всяка една фигура от масива с Object.keys(arrayOfFigures[i]) - начертаните на канваса фигури . Дава ми обаче празен масив от keys, когато използвам Object.keys(arrayOfFigures[i]), въпреки, че всяка отделна фигура с която итерирам си има пълните присъщи за нея properties. 

 

Това ми е класа за фигури

https://pastebin.com/vsV4KbmR

Това ми е класа за геометрията:

https://pastebin.com/nkj60uyx

Това е проблемната функиця:

https://pastebin.com/NiV4EcbB

Това е repsoitory-то с API-то:

https://github.com/nikolaydimov83/Javascript_OOP_Homeworks

 

Много ще се радвам, ако някой ми обясни защо се получават тези празни масиви, въпреки, че при дебъга съответните елементи - геометрични фигури си имат пълни пропертис и валюс. Помислих да не би да е от това, че си крия properties на геометричната фигура с weak maps и пробвах да създам функция директно в класа на геометричната фигура, но резултата е същия.

 

Благодаря предварително!

Тагове:
0
JavaScript Advanced
Tzigoriyn avatar Tzigoriyn 44 Точки

Здравей.

При проверките даваше грешки когато се опитвам да преместя на горе и на долу създадените фигури.

Ако правилно съм те разбрал и при факта, че незнам условието?!?

https://pastebin.com/N5gk0NZp

само тези поправки оправят всичко.

if (this.selectedFigure >= 0), а иначе имаш много такива проверки при които this.selectedFigure = "-1", което всъщност е стринг и проверката не е адекватна.

Кода работи, създава фигури, само за да видиш триъглника трябва да зададеш две координати в едната колона и една в другата:

-примерно x1,x2 и y2.

 

Иначе не си поставял ";" на края на всеки ред, което не е добра практика.

Успех!

П.П.

JS не е обектно ориентиран език "OOP", а език за функционално програмиране.

1
15/06/2022 19:59:26
nikolay.dimov83 avatar nikolay.dimov83 143 Точки

Здравей,

Благодаря ти много! Да имаше бъгове и проверките не са ОК ще ги оправя.

Всъщност след като си анализирах кода се оказа, че основният проблем с Object.keys() е, че когато създам properties с Weak Map и после ги достъпвам в класа, тези properties са non-enumerable. Има ли начин лесен начин properties създадени с weak map да бъдат създани като enumerable?

0
Tzigoriyn avatar Tzigoriyn 44 Точки

WeakMap() - има много рестрикции ако прочетеш MDN ще разбереш:

" WeakMap allows associating data to objects in a way that doesn't prevent the key objects from being collected, even if the values reference the keys. However, a WeakMap doesn't allow observing the liveness of its keys, which is why it doesn't allow enumeration; if a WeakMap exposed any method to obtain a list of its keys, the list would depend on the state of garbage collection, introducing non-determinism. If you want to have a list of keys, you should use a Map rather than a WeakMap."

--> Замени

 new WeakMap(); с  new Map();

И в двата фила:

shapes.js и geometryDraw.js

Пробвах го и май стана ;), така няма да получаваш празни обекти, поне аз не видях.

Надявам се да съм ти помогнал или не?

Драсни два реда като отговор, моля стана ми интересно.

 

2
16/06/2022 13:40:50
nikolay.dimov83 avatar nikolay.dimov83 143 Точки

Много ти благодаря! Ще го пробвам още утре и ще пиша, но от това което цитираш от MDN мисля, че ще стане.

Осъзнах и че правя капитална грешка, като пропускам и не преглеждам MDN при резултатите от google search   

1
Tzigoriyn avatar Tzigoriyn 44 Точки

Това че не четеш MDN не е добра идея. Там се вижда кога нещо е "deprecated!!!", а пък най-отдолу в таблиците е отбелязано в таблици при кои бораузери работи и коя версия.

Много полезна информация!!!

Радвам се, че можах да помогна.

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.