{_proto: プロトタイプベース・オブジェクト指向};at TECH
{_proto: プロトタイプベース・オブジェクト指向}; - 暇つぶし2ch179:デフォルトの名無しさん
06/06/11 10:04:42
いずれにせよ、委譲するか、その必要がないかに帰着できる。

180:176
06/06/11 14:37:11
だからそれだけじゃ足りないんだって。
委譲するかどうかだけではリソースの扱いを決定できないんだって。

委譲しない(=自分が所有権を持つ)としても、もし他と共有するとなるとそのリソース
(メソッド)を勝手に加工できないから、それなりの扱いが必要でしょ

コピーするかどうかは、初期化の場面しか関係しないけどな。


181:デフォルトの名無しさん
06/06/11 18:29:11
それは小手先に過ぎなくて、なんというか本質から外れているような。

182:デフォルトの名無しさん
06/06/11 19:07:05
ああ。なんか分かってきたぞ。

176は、継承(あるいはインスタンス化、もしくはクローン化)の様式を整理したいのか。
それならコピーがどうのこうのってのも分かる。
たしかに、委譲の他に、手続きを共有する方法と、コピーを持ってしまう方法がある。

まあ、172がそもそも何を聞きたいのかわからんというのが問題なのだが…。
「プロトタイプ毎」というのはおかしいから「プロトタイプ(ベースの)言語」のプロトタイプに
引っ張られて「オブジェクト毎」とするところを書き(あるいは理解し)間違えたと解釈して、

「オブジェクト毎にメソッドを持つかどうか」

と問われているとすれば、そういうこともあるし他者に委譲することもある、と答えるし、そうではなく、

「クローン(多くの場合チャイルド)はプロトタイプ(多くの場合ペアレント)にメソッドを持たせるのか」

と問うているのならば、それ、つまり、委譲機構以外にも自前でコピーで持ったり(クローン、コピー)、
プロトタイプと共有する(シャローコピー)のこともある、という176のような答になる。

183:172
06/06/11 19:45:16
スンマせん。過疎スレだったので、ちゃんと整理せずに軽い気持ちで書き込みますた。

プロトタイプ言語のインタープリタを作る時に、メソッドの一覧は何処に持たせるのが
良いのかなというのが最初の疑問です。

何処に?
・グローバルに 1 つ
・メソッド名毎に 1 つ(ジェネリックな感じで)
・オブジェクト毎(プロトタイプもオブジェクトに含む)

どういう形式で?
・リスト
・ハッシュ

クラスベースな言語なら、クラス毎にハッシュでメソッドリストを持たせてもそんなに
オーバーヘッドな感じはしないですが、プロトタイプ言語でオブジェクト毎にハッシュを
持たせたら、個々のオブジェクトのサイズが大変な事になりそうで。

今考えているのは、オブジェクト毎にメソッドのリストを持たせて、グローバルにハッシュで
キャッシュを持つ感じです。io なり javascript なりの実装を調べてみます。

184:デフォルトの名無しさん
06/06/11 19:57:27
>>183
最初からそう言えや (´・ω・`)

例えば io はオブジェクト毎にハッシュテーブルを1つ持ってる。
他は知らないけど。


ちなみに 『プロトタイプもオブジェクトに含む』 みたいな文が出てくる時点で、
あまりプロトタイプベースについて詳しくないんじゃないかなとか予想してたり。

185:172
06/06/11 20:14:36
>>184
重ね重ねスミマセン。

プロトタイプは、単に他のオブジェクトのプロトタイプスロットから参照されているだけで、
実態は普通のオブジェクトだと思ってました。

186:更紗 ◆SARAHxmkr.
06/06/15 04:23:03
// 継承前
function Person(nAge) {
this.m_nAge = nAge;
}

Person.prototype.getAge = function() {
return this.m_nAge;
};

// 継承先
function Programmer(nAge, strProject) {
this.__super = Person; // 新インスタンスを介して
this.__super(nAge); // 継承元コンストラクタを呼ぶ
this.constructor = Programmer; // コンストラクタが Person にセットされるので元に戻す
delete this.__super;
/* Programmer コンストラクタの処理 */
}

// 継承先の方法2つ目
function Programmer(nAge, strProject) {
Person.call(this, nAge);
this.constructor = Programmer;
/* Programmer コンストラクタの処理 */
}
このコードでPersonのプロパティをProgrammerのプロパティで継承する際に、
Person(nAge)として、親のコンストラクタを呼んで
値を初期化せずに、スコープを変更して呼びしているのは、
そうしないと、値へのアクセスがインスタンスを介して出来なくなるからですか?
いまひとつ変数のスコープが理解できません。
Personクラスのthis.m_nAge = nAge;を呼び出しても、
インスタンスがthisに入るので、インスタンスの変数としてm_nAgeが初期化され
そうに思えてしまいます。

187:更紗 ◆SARAHxmkr.
06/06/15 04:24:59
 

188:デフォルトの名無しさん
06/06/15 15:47:53
>>186
this には、その関数を起動する際の第一オペランド(ドット演算子の前にあるオブジェクト)が束縛されています。
メッセージングメタファで言えば、メッセージの受け手であるレシーバですね。(どちらでも、お好きな方で)

new Programmer(21, "EJS"); で起動された Programmer 内において、this には、新しく作られたインスタンス
(ここでは仮に this_prog と呼称することにします)が束縛されています。その場で this.__super(nAge); により
起動、つまり、this_prog.__super(nAge) で起動された Person 内では、this は this_prog を束縛することになります。

ですから、Person 内の this.m_nAge = nAge; は、つまり this_prog.m_nAge への nAge の束縛ということに
なるので、戻ってくると新しく作ったインスタンスの m_nAge スロットには 21 が束縛されている…というカラクリです。

もし、__super スロットを介さずに、ただ Person を起動しただけでは、第一オペランドが省略時のグローバル
オブジェクト [object global] になってしまうので、Person 内の this もそうなってしまい、m_nAge スロットも
グローバルオブジェクトに作られてしまいます。

189:デフォルトの名無しさん
06/06/15 22:53:19
>>188
なるほど、そういう風に規定されているのですね。
勉強不足ですいません・・・ありがとうございます

190:更紗 ◆SARAHxmkr.
06/06/15 23:22:21
>>612
// 継承前
function Person(nAge) {
this.m_nAge = nAge;
}

Person.prototype.getAge = function() {
return this.m_nAge;
};

// 継承先
function Programmer(nAge, strProject) {
this.__super = Person; // 新インスタンスを介して
this.__super(nAge); // 継承元コンストラクタを呼ぶ
this.constructor = Programmer; // コンストラクタが Person にセットされるので元に戻す
delete this.__super;
/* Programmer コンストラクタの処理 */
}

// 継承先の方法2つ目
function Programmer(nAge, strProject) {
Person.call(this, nAge);
this.constructor = Programmer;
/* Programmer コンストラクタの処理 */
}

まあ、これなんだけどね。
Person.call(this, nAge);
ここが何でこうなるんだろうと凄く不思議に思った。
prototype.jsはどうやってクラスみたいな仕組みを実装してるんだろうか。


191:更紗 ◆SARAHxmkr.
06/06/15 23:23:16
すいません・・・誤爆しました。。
きにしないでください

192:デフォルトの名無しさん
06/10/09 11:42:23
prototypeのAjax.UpdaterってFireFoxで動かない?
evalScripts:trueで使いたいんだけど、どうも動かない。既出?

193:デフォルトの名無しさん
06/10/09 12:28:20
>>192
板違い。こっち池。
+ JavaScript の質問用スレッド vol.51 +
スレリンク(hp板)

194:デフォルトの名無しさん
06/10/09 12:34:58
>>193
あああ・・・そっちもスレ違いなので変なの誘導しないで・・・

195:デフォルトの名無しさん
06/12/10 01:29:51
JavaScriptは大流行りなのに、こっちは寂れてしまったな

196:デフォルトの名無しさん
06/12/10 01:39:01
>>195
でもその話しちゃうと現場での愚痴大会になっちゃうからなぁ。


197:デフォルトの名無しさん
06/12/10 01:48:43
寂れてもチェックは欠かさない

198:デフォルトの名無しさん
06/12/10 13:43:52
JavaScriptでもプロトタイプ継承をバリバリ使ってるやつは例外中の例外だろ

199:デフォルトの名無しさん
07/01/04 23:05:10
冬休み中にself似の言語にnative型の概念入れようと努力したけどムリポ



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch