It creates a ref type object (Musician) that is mutable.
What that means is that its state can be changed.
if I take that Person named Prince and change his stage name
We will still only have one Musician object in memory that has a StageName of "Prince".
However that is to say the members are not mutable. All the stage names set are immutable which in contrasts means that
their state can never be changed.
But, Terrance. It looks like they values are changing for Stagename and you said the is only one musician so doesn't that mean you either shouldn't be able to change the value of stage name or that all the stage names are somewhere?
So with that all immutability really means is that the data stored at a location or "address" will not change. This does not mean that the state of our current object will not change. In our case it means that the Musician is directing all who access the Stage Name to refer to him as what he is currently pointing to. This also means that there is a potential for a lot of memory to be used when dealing with a large number of strings or a large number of literal assignments.
To apply the behavior you expected (as far as immutability is concerned) there is a neat function that is partially supported referred to as Object.freeze() that will make an object Immutable.
See it in action here. *note that this will potentially throw a TypeError when using Strict Mode
While we might remember,for a time, all the different stage
names he has given himself over the years,
if nothing else he will always simply be Prince... lol