2009-07-08

本当にnewっていらない子

なんかPerlのblessっぽい。

JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)

というよりperlのnewっぽい。なぜか。

classクラス定義してnewでインスタンスを生成する言語を「一般的オブジェクト指向言語」とすると、

つまり、javascriptでnewを(直接)使わず、class(のようなもの)を作ればperlっぽくなる。

そもそもnewって何するの?

オブジェクトを作る。オブジェクトを作るには3つの動作が必要である。

  1. 領域を作る
  2. クラスと結びつける
  3. 初期化する

通常は言語仕様でこれらを行う"new"という命令が用意されている。しかし、必ずしも必要な物ではない。perlでは言語仕様としてはnewが用意されていない。new関数が存在するのはコーディング規約に従っているからに過ぎない。代わりにblessが用意されている。なぜこのようになっているのか。理由はいたって簡単だ。perlオブジェクトの実態はリファレンスだ。初期化を行うコンストラクタはどの道定義せねばならない。だから必要なのはリファレンスパッケージを結びつけるおまじないblessだけだ。コンストラクタで好きなリファレンスを用意し、好きなように初期化してblessすればよい。コンストラクタ名前コーディング規約でnewと決めた。一方javascriptはnewを用意した。{}でオブジェクトは作れるし、どの道コンストラクタは作る必要があるのに。

そもそもblessって何するの?

オブジェクトクラスを結びつける。しかし、javascriptクラスを持たないので必要はない。代わりに必要なのは、継承元との結びつき、プロトタイプチェーンの構築だ。

そもそも継承って何するの?

既存のクラスの性質や振る舞いを流用する。default状態を与える。一般的オブジェクト指向言語ではクラス定義時に継承元となるクラスを指定する。javascriptではクラスの代わりにオブジェクトを指定する。

そもそもクラスって何するの?

クラスとはオブジェクトの性質・振る舞いの定義だ。しかし、ダック・タイピングではオブジェクトの性質や振る舞いはオブジェクトの持つメンバにより決まるため、そのような環境ではオブジェクトに初期値と継承関係を与えるのが主な仕事となる。

そもそもコンストラクタって何するの?

コンストラクタオブジェクト初期化を行う。javascriptではクラスがないため継承コンストラクタによりオブジェクト初期化される。

つまりコンストラクタ継承すれば良いんじゃね?

var object = function(o) {
  var F = function() {};
  F.prototype = o.prototype;
  return new F;
};

JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)

個人的には

var object = function(o) {
  var F = function() {};
  F.prototype = o;
  return new F;
};

で良いんじゃね?って思う。

更に、コレでは初期化しないから

var object = function(o, n) {
  var F = function() {};
  F.prototype = o;
  f = new F;
  if (n) for (var i in n) f[i] = n[i];
  return f;
};

みたいな。

さらにせっかくだからメソッドにして

var object = function(o, n) {
  var F = function() {};
  F.prototype = o;
  f = new F;
  if (not f.inherit) f.inherit = function(n) {object(this, n)};
  if (n) for (var i in n) f[i] = n[i];
  return f;
};

とか。

しかし、なんでこんなに今の継承機構は使いづらいのか。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん