The hash bit me in a way worth knowing: anything that serialises by walking properties will not see them. Structured clone, a naive JSON round trip, and several validation libraries all quietly drop them, and you get an object that looks right and has lost half its state.
The keyword version survives all of that, because at runtime it is an ordinary property.