JavaScriptのprototype-based OOにおけるプロトタイプオブジェクトの共有(継承)について

4
Kazuho Oku @kazuho

この手法だと JavaScript の instanceof は使えないんじゃないかしら / “How CoffeScript classes work - Islands in the byte stream” http://t.co/ewSffSPz

2012-03-10 22:31:33
FUJI Goro @__gfx__

そもそもJavaScriptのinstanceofってなんだっけ、というレベル。

2012-03-10 22:34:39
Kazuho Oku @kazuho

@__gfx__ prototype OO 的には、プロトタイプオブジェクトは一意に決まるはずなので、クラス定義構文を var Derived = new Base(args).extend({ /* classdef */ }); とすれば代理 ctor 不要

2012-03-10 22:36:14
FUJI Goro @__gfx__

@kazuho とりあえずinstanceofは動くみたいですね!

2012-03-10 22:37:13
Kazuho Oku @kazuho

つまり prototype OO らしくインスタンスを継承するのではなく、クラスから継承しようとしているがゆえのひずみ

2012-03-10 22:37:15
Kazuho Oku @kazuho

@__gfx__ それ coffeescript の instanceof が .prototype を比較するみたいな実装になってるとかじゃなくて?

2012-03-10 22:37:50
FUJI Goro @__gfx__

@kazuho そのnew Base(args)...のargsを自動的に決められないので代理ctorが必要ってことじゃないんです?

2012-03-10 22:38:09
Kazuho Oku @kazuho

@__gfx__ 決められると考えるのがプロトタイプOO。なぜならオブジェクトを継承するのだから。

2012-03-10 22:38:35
FUJI Goro @__gfx__

@kazuho いえ、コンパイル後のJSでinstanceofしてみました!

2012-03-10 22:38:38
FUJI Goro @__gfx__

@kazuho えーっ!思想的にはわかりますが、現実問題決められないこともありません?

2012-03-10 22:39:25
Kazuho Oku @kazuho

@__gfx__ 必ず決まるよ。スーパークラスの初期化関数を呼び出すことと、プロトタイプが何か一意に決まってるっていうことは、両立可能でしょ

2012-03-10 22:40:49
Kazuho Oku @kazuho

スーパークラスのパラメータを、プロトタイプと異なる値に初期化したければ Super.call(this, args...); すればいいだけの話

2012-03-10 22:42:19
FUJI Goro @__gfx__

@kazuho それって function C(args) { this.__proto__ = new P(args) } のとき、argsは必ず決まるってことですか。問題は__proto__がECMA262標準じゃないってことですが。

2012-03-10 22:44:05
FUJI Goro @__gfx__

__proto__が標準じゃないからいろいろややこしいのでは!

2012-03-10 22:45:26
Kazuho Oku @kazuho

純粋な prototype OO にコンストラクタはないのよ。ただ JS は必ず new Foo() って初期化関数を呼び出す制約をいれてるだけ。Foo 自体は通常の関数なので、Foo.apply(this, ..) とかしたっていい

2012-03-10 22:47:57
Kazuho Oku @kazuho

new Foo() される Foo は通常の関数なので、Foo.prototype から「変更する」値だけセットすればいい。それが prototype-based ってこと

2012-03-10 22:48:37
FUJI Goro @__gfx__

@kazuho そもそも https://t.co/yii0lPdG がクラス定義の話なのかインスタンス生成の話なのかよくわかりません><

2012-03-10 22:51:41
Kazuho Oku @kazuho

@__gfx__ prototype-base に忠実に書くなら、こういう感じになるってこと https://t.co/2ucALB9M

2012-03-10 22:54:13
Kazuho Oku @kazuho

JS のインスタンス生成が new funccall() って関数呼び出しを伴うのは prototype-based OO としては違和感あるけど、オブジェクトがリファレンスである以上、しょうがない感じもしてる。プロパティが配列だったりするとインスタンス毎に初期化せざるを得ないし

2012-03-10 22:56:07
FUJI Goro @__gfx__

@kazuho ああわかりました!でもこれ、たとえばBaseがfdなどの外部リソースを確保するようなものだとやっぱり代理ctorが必要になりません?

2012-03-10 22:56:20
Kazuho Oku @kazuho

@__gfx__ いいポイントだと思うけど、複製不可能なものを is-a で表現しなければおk

2012-03-10 22:57:47
Kazuho Oku @kazuho

prototype なんだから複製可能が前提

2012-03-10 22:58:12