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.
Това ми е класа за фигури
Това ми е класа за геометрията:
Това е проблемната функиця:
Това е repsoitory-то с API-то:
https://github.com/nikolaydimov83/Javascript_OOP_Homeworks
Много ще се радвам, ако някой ми обясни защо се получават тези празни масиви, въпреки, че при дебъга съответните елементи - геометрични фигури си имат пълни пропертис и валюс. Помислих да не би да е от това, че си крия properties на геометричната фигура с weak maps и пробвах да създам функция директно в класа на геометричната фигура, но резултата е същия.
Благодаря предварително!
Здравей,
Благодаря ти много! Да имаше бъгове и проверките не са ОК ще ги оправя.
Всъщност след като си анализирах кода се оказа, че основният проблем с Object.keys() е, че когато създам properties с Weak Map и после ги достъпвам в класа, тези properties са non-enumerable. Има ли начин лесен начин properties създадени с weak map да бъдат създани като enumerable?
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, aWeakMap
doesn't allow observing the liveness of its keys, which is why it doesn't allow enumeration; if aWeakMap
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 aMap
rather than aWeakMap
."--> Замени
new WeakMap(); с new Map();
И в двата фила:
shapes.js и geometryDraw.js
Пробвах го и май стана ;), така няма да получаваш празни обекти, поне аз не видях.
Надявам се да съм ти помогнал или не?
Драсни два реда като отговор, моля стана ми интересно.
Много ти благодаря! Ще го пробвам още утре и ще пиша, но от това което цитираш от MDN мисля, че ще стане.
Осъзнах и че правя капитална грешка, като пропускам и не преглеждам MDN при резултатите от google search