youichさん、ありがとうございます。
言葉の意味を、しっかり理解していないためにあいまいな表現となってしまいました。
prototype,__proto__の自分の考えを言葉で表現しようとすると微妙なニュアンス等で、
相手に伝わりにくいとの判断から、あのような長い文章になってしまいました。ご了承ください。
長い文章でしたのに、貴重な時間を割いてまで読んで頂いて・・・その上、添削までして頂いちゃって・・・
なんとお礼を言ったらよいか・・・本当にありがとうございます。みなさんのことを師匠と呼んでも良いですか?
このスレッドで得たこと(私の今度こそ本当に最後の一言)
AS2.0で書く!と決めたらprototype,__proto__の事は忘れた方が良いと思いました。
色々悩んだ末に結局マニュアルに記載されている通りであるとの結論に達しました。
自分の能力の無さを棚に上げてマニュアルの所為にするのは良くないですね。
あと、(サブクラス).prototype.__proto__ ←→ (スーパークラス).prototype の参照が継承なのだ
と考えた時期もあったのですが、AS2.0では、これとは別に継承関係が管理されてるような気がしてます。
これが、私を混乱させていた原因の一つであったと思います。
野中さんがおっしゃられているように、これからは問題を切り分けて理解していきたいと思います。
でも、AS2.0を使い慣れるまではprototype,__proto__の事はとりあえず忘れます。
以下は、このスレッド最後の私の意見とします。(また長いですけど許して?)
//(2004/2/13修正)
//エラーにして欲しいです…ビルトインクラスを上書きしてどんなメリットが?
//var Math:A = new A(); //エラーなし
//////////////////////////////////////////////////AS2.0によるクラス定義//
/* A.as
class A{
var protoProp:String="protoProp";
var instanceProp:String;
function protoMeth(Void):String{
return "protoMeth";
}
}*/
/* B.as
class B extends A{}*/
//AS2.0のdynamicクラスでなくてもAS1.0の仕様でprototypeには動的にエレメントを追加できる
A.prototype.extraProp = "extraProp";
A.prototype.extraMeth = function(Void):String{return "extraMeth";};
var a:A = new A();
//dynamicクラスではないのでprototypeで動的に追加したエレメントは呼び出せない
trace(a.protoProp == A.prototype.protoProp); //true
trace(a.instanceProp == A.prototype.instanceProp); //true
trace(a.protoMeth == A.prototype.protoMeth); //true
trace(a.__proto__.extraProp == A.prototype.extraProp); //true
trace(a.__proto__.extraMeth == A.prototype.extraMeth); //true
//trace(a.extraProp); //エラー a.extraPropとすることは禁止される(AS2.0のクラス定義に準ずる)
//trace(a.extraMeth()); //エラー a.extraMethとすることは禁止される(AS2.0のクラス定義に準ずる)
var b:B = new B(); //class B extends A AS2.0によりBクラスはAクラスを継承
trace(b.__proto__.extraProp == A.prototype.extraProp); //true
trace(b.__proto__.extraMeth == A.prototype.extraMeth); //true
//trace(b.extraProp); //エラー b.extraPropとすることは禁止される(AS2.0のクラス定義に準ずる)
//trace(b.extraMeth()); //エラー b.extraMethとすることは禁止される(AS2.0のクラス定義に準ずる)
//trace(B.prototype.__proto__ == A.prototype); //true ですが、これはAS2.0での継承とは意味が違う
//////////////////////////////////////////////////AS1.0によるクラス定義//
function C(){ //class C AS1.0により定義(class A相当)
this.instanceProp;
}
C.prototype.protoProp="protoProp";
C.prototype.protoMeth = function(){return "protoMeth";};
C.prototype.extraProp = "extraProp";
C.prototype.extraMeth = function(){return "extraMeth";};
function D(){} //class D AS1.0により定義('D.prototype = new C();'でclass B相当)
c = new C();
trace(c.protoProp == C.prototype.protoProp); //true
trace(c.instanceProp == C.prototype.instanceProp); //true
trace(c.protoMeth == C.prototype.protoMeth); //true
trace(c.extraProp == C.prototype.extraProp); //true
trace(c.extraMeth == C.prototype.extraMeth); //true
D.prototype = new C(); //class D extends C AS1.0によりDクラスはCクラスを継承
d = new D();
trace(d.extraProp == C.prototype.extraProp); //true
trace(d.extraMeth == C.prototype.extraMeth); //true
//trace(D.prototype.__proto__ == C.prototype); //true これはAS1.0での継承を意味する
//以上