リテラルでprototype書いたら

function X(){};
X.prototype.a='a';
var x=new X();

console.log(x.__proto__); // X { a="a"}
console.log(x.constructor); // X()

疑惑のリテラル

function Y(){};
Y.prototype={a:'a'};
var y=new Y();

console.log(y.__proto__); // Object { a="a"}
console.log(y.constructor);  // Object()

何故YでなくObject?
どういう違いでこうなるのかしら。
リテラルで代入すると実はダメってこと?


ははーん、ではこれなら?

function Z(){};

(function(){
  this.a='a';
}).apply(Z.prototype);

var z=new Z();

console.log(z.__proto__);  // Z { a="a"}
console.log(z.constructor); // Z()

これだと大丈夫。


今まで結構普通にリテラルで使ってきたけど、実はよくないのだろうか。
確かにまるごと代入しているので、元あるもの(しかしprototypeの初期値は空の筈??)を上書きしているには違いないが。。