Referencing game objects/script communication

I’m new to this and know there are a lot of similar questions, but I want to double check if I’m misunderstanding something.

I’m making a simple game where you upgrade weapons, my example weapon is an ice weapon that on enemy death spawns an icy area that slows enemies inside.

The script for the weapons is actually on the bullets and I don’t know how it’s possible to have all the variables on that.

I can do everything I want my weapon to do except make the slow amount up-gradable, I don’t know how to get the slow amount into the enemy script because there aren’t always bullets on the screen and that’s when an error would happen.

I used to do it by having these variables on the player and referencing those variables in the bullet script, but it feels like a work around.

Is there a way to reference an object on an object?

It doesn’t make much sense to have a weapon script on a bullet,
You would keep the slow amount on the weapon and apply that slow amount onto the bullet
when it is spawned, that way you can upgrade the slow amount on the weapon and it will be
automatically applied to the bullet.

Or you can make all your variables static, that way they will be available without an instance of your object.
You could just do Weapon.SlowAmount or something, without having an instance/reference to your weapon.