- 1 名前:デフォルトの名無しさん [05/03/05 00:08:47 ]
- 実装談義も哲学論議も。
プロトタイプベース・オブジェクト指向とは sumim.no-ip.com:8080/wiki/493 Google Directory Prototype-based directory.google.com/Top/Computers/Programming/Languages/Object-Oriented/Prototype-based/ Self research.sun.com/research/self/ Io www.iolanguage.com/ ほか >>2-10あたり 前スレ プロトタイプベース・オブジェクト指向 pc5.2ch.net/test/read.cgi/tech/1070886635/
- 184 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 19:57:27 ]
- >>183
最初からそう言えや (´・ω・`) 例えば io はオブジェクト毎にハッシュテーブルを1つ持ってる。 他は知らないけど。 ちなみに 『プロトタイプもオブジェクトに含む』 みたいな文が出てくる時点で、 あまりプロトタイプベースについて詳しくないんじゃないかなとか予想してたり。
- 185 名前:172 mailto:sage [2006/06/11(日) 20:14:36 ]
- >>184
重ね重ねスミマセン。 プロトタイプは、単に他のオブジェクトのプロトタイプスロットから参照されているだけで、 実態は普通のオブジェクトだと思ってました。
- 186 名前:更紗 ◆SARAHxmkr. mailto:sage [2006/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. [2006/06/15(木) 04:24:59 ]
-
- 188 名前:デフォルトの名無しさん mailto:sage [2006/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 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 22:53:19 ]
- >>188
なるほど、そういう風に規定されているのですね。 勉強不足ですいません・・・ありがとうございます
- 190 名前:更紗 ◆SARAHxmkr. mailto:sage [2006/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. mailto:sage [2006/06/15(木) 23:23:16 ]
- すいません・・・誤爆しました。。
きにしないでください
- 192 名前:デフォルトの名無しさん [2006/10/09(月) 11:42:23 ]
- prototypeのAjax.UpdaterってFireFoxで動かない?
evalScripts:trueで使いたいんだけど、どうも動かない。既出?
- 193 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 12:28:20 ]
- >>192
板違い。こっち池。 + JavaScript の質問用スレッド vol.51 + pc8.2ch.net/test/read.cgi/hp/1158468856/
- 194 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 12:34:58 ]
- >>193
あああ・・・そっちもスレ違いなので変なの誘導しないで・・・
- 195 名前:デフォルトの名無しさん [2006/12/10(日) 01:29:51 ]
- JavaScriptは大流行りなのに、こっちは寂れてしまったな
- 196 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 01:39:01 ]
- >>195
でもその話しちゃうと現場での愚痴大会になっちゃうからなぁ。
- 197 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 01:48:43 ]
- 寂れてもチェックは欠かさない
- 198 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 13:43:52 ]
- JavaScriptでもプロトタイプ継承をバリバリ使ってるやつは例外中の例外だろ
- 199 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 23:05:10 ]
- 冬休み中にself似の言語にnative型の概念入れようと努力したけどムリポ
|

|