copy!=clone!=reference

Вчера освежал в памяти JS и признаться немного нормально так поломал голову, предлагаю знатокам задачку:

function C(){}
function c(o) {
C.prototype = o;
return new C();
}

x={a:1};
y=x;
y.a=2;
alert('I:'+x.a);

x={a:1};
y=x;
x.a=2;
alert('II:'+y.a);

x={a:1};
y=c(x);
y.a=2;
alert('III:'+x.a);

x={a:1};
y=c(x);
x.a=2;
alert('IV:'+y.a);

x={a:{a:1}};
y=c(x);
x.a=2;
alert('V:'+y.a.a);

x={a:{a:1}};
y=c(x);
y.a=2;
alert('VI:'+x.a.a);

x={a:{a:1}};
y=c(x);
y.a.a=2;
alert('VII:'+x.a.a);

x={a:{a:1}};
y=c(x);
x.a.a=2;
alert('VIII:'+y.a.a);

x={a:1};
y=c(x);
y.a=2;
delete y.a
alert('IX:'+y.a);

x={a:1};
y=c(x);
x.a=2;
delete x.a
alert('X:'+x.a);

Можно конечно запустить и поумничать ;) но предлагаю играть в открытую и предложить свой вариант ответов с пояснением.
Update: поправил функцию - вместо аргумента 'o' использовался несуществующий 'obj'

top of hotblogs.org.ua

Комментарии

Я попробывал:
I:2 - передача по ссылке
II:2 - передача по ссылке, тот же объект
III:1 - С() - объявляется класс и в с() создается его копия через прототип
IV:1 - проверил получается 2 ((
V:1 - проверил undef, выходит объект не копируется, тогда не понятно почему в III получается 1 (((
VI:2 - проверил 1, а значит x не изменился, хм...
VII:1 - почему 2!!!!
VIII:1 - проверил 2, видимо всетаки по ссылке
IX:undef - на проверке 1...
X:undef - да!
Будут пояснения? Это баг или это фича такая?

Первые два - понятно там ссылка. В остальных кажется есть зависимость результата от того, какой из объектов меняется. Пока не понятно... надо погуглить )

Изображение пользователя Gaudeamus.

Привожу ссылку на статью, поясняющую суть этих примеров.
http://oranlooney.com/functional-javascript/