12月6日 「テリーの愛犬」

ロバート・デニーロはどこに出たのだろう。まさかエルモのコーナじゃ……。だとしたら観たかったのに……。

15.prototypeプロパティ

JavaScript言語では、オブジェクトのプロパティを探索する際に、まずオブジェクトが直接持っているプロパティから、該当のプロパティを探索します。そこになかった場合、オブジェクトのクラス(JavaScriptの場合、厳密にはコンストラクタ)のprototypeプロパティの中から、該当する名前のプロパティを探します。

たしかこの辺りを鵜呑みにしていたと思う。

function C(){}
var c = new C;
C.prototype = { x: 'x' };
c.x; // undefined

ほら。C.prototypeは見ていないよ。

function C(){}
var c = new C;
C.prototype.x = 'x';
c.x; // 'x'

C.prototype はただの参照。

詳しく書いた。agenda(Weblog)プロトタイプチェインについての覚書(ECMAScript, JavaScript)


話題は逸れるけれど今使っている擬似継承用のメソッド:


Function.prototype.inherit = function(superClass) {
  /* http://www.skipup.com/~peace/javascript/ */
  function Temp(){}
  Temp.prototype = superClass.prototype;
  this.prototype = new Temp;
  this.prototype.__super__ = superClass;
  this.prototype.constructor = this; };

これは本当はこうしたい。


Function.prototype.inherit = function(superClass) {
  this.prototype.__proto__ = superClass.prototype;
  this.prototype.__super__ = superClass; };

Tempなる空っぽのコンストラクタを呼び出したり、消してしまったconstructorプロパティを再設定するのを防げるし、何よりプロトタイプチェインが「見える」。

Object-Oriented Programming with JavaScript, Part I: Inheritance
JScript - Dynamic Scripting

これらとECMAScript仕様書をあわせ読みつつ、ようやくJavaScriptのプロトタイプチェインが理解できた気がする。というか__proto__で分かった。コンストラクタのprototypeプロパティなんか参照しないじゃあないか(ユーザー定義の場合は new するとき以外)。これが数々の誤解を生んでいたと思うと……。