ログイン
メインメニュー
|
投稿者 |
スレッド |
takiguchi |
Åê¹ÆNo.3785 投稿日時: 2004-2-13 11:41 |
半人前 居住地: 東京 投稿: 38
使用環境: Win2K,FlashMX2004Pro7.0.1
|
Re: クラス内の変数について 野中さん、ありがとうございます。 戻り値比較しちゃいました 危ないところでした…結果に違いが生じなくて助かりました。
|
|
|
野中文雄 |
Åê¹ÆNo.3761 投稿日時: 2004-2-12 22:33 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境: CS5.5 .6.8 Vista Home Premium (SP1)
|
Re: クラス内の変数について 細かいことで、1点気になりましたので補足です。 function自体の比較と戻り値の比較は、区別する必要があります。 // ActionScript 2.0クラス定義ファイル: A.as
class A{
var protoProp:String="protoProp";
var instanceProp:String;
function protoMeth():String{
return "protoMeth";
}
function protoMeth2():String{ // [追加]
return "protoMeth";
}
}
// フレームアクション
var a:A = new A();
trace(a.protoMeth() == A.prototype.protoMeth()); //true
// 以下追加テスト
trace(a.protoMeth2() == A.prototype.protoMeth()); // true
trace(a.protoMeth2 == A.prototype.protoMeth); // false
trace(a.protoMeth == A.prototype.protoMeth); // true
trace(_root.play() == _root.stop()); // true
----------------
|
|
|
youich |
Åê¹ÆNo.3714 投稿日時: 2004-2-12 3:00 |
職人 居住地: kobe 投稿: 349
使用環境: Tiger
|
Re: クラス内の変数について takiguchiさん、私もこれで、最後にします。。が誤解を与えたまま終わるのは、しのびないですので(^^; 引用: あと、(サブクラス).prototype.__proto__ ←→ (スーパークラス).prototype の参照が継承なのだ と考えた時期もあったのですが、AS2.0では、これとは別に継承関係が管理されてるような気がしてます。
またまた、混乱させては申し訳ないので軽くおぼえておいて下さい、 AS2.0で実際に継承関係を管理しているのは AS1.0と変わりなくやはりprotoytpeや__proto__なんです。 takiguchiさんの前のポストのクラスAはコンパイル後は
function A(){}
A.prototype.protoProp = "protoProp";
A.prototype.protoMeth = function(){
return "protoMeth";
}
となります、これが私が言ってたAS2.0の継承の実体ということだったのですね。 しかしAS2.0で実際にコードを書く時にはおっしゃる通りこういうことは まったく気にかけないでいいですね。 ではでは ---------------- - yo
|
|
|
takiguchi |
Åê¹ÆNo.3710 投稿日時: 2004-2-12 2:14 |
半人前 居住地: 東京 投稿: 38
使用環境: Win2K,FlashMX2004Pro7.0.1
|
Re: クラス内の変数について 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での継承を意味する
//以上
|
|
|
youich |
Åê¹ÆNo.3707 投稿日時: 2004-2-11 22:27 |
職人 居住地: kobe 投稿: 349
使用環境: Tiger
|
Re: クラス内の変数について 引用: 「ProtoExample.prototypeをPROTOTYPEに、 obj1.__proto__をobj1._protoに置き換えて考えてみましょう!」 「ProtoExampleのようなことが、何者かによって私たちの見えないところで行なわれているのです!」 という、とらえ方で大丈夫でしょうか? 何者というか、MMがそういう風に作ってるんですね(^^; クラスを使うときにはProtoExampleのようなことが行われるということですね。 引用: あと…ProtoExampleに関して分からない事が1点あります。 下記のように__resolveが3回も呼ばれることです(うち2回がobj1) これは野中さんがご返答されてる通りです。 obj1.datas[0] = "X" <-- (1) trace([PROTOTYPE.datas.obj1.datas,obj2.datas]) <-- (2)、(3) の3回ですね。 あと力作ですがちょっと気になる所が 引用: ここは「●クラスを定義するということをディレクトリー階層を使ってASの実装を考えてみると」 のほうが、いいんじゃないかと思います。 あと"実装継承"という単語がよくでてきますが "実装継承"は"ASでの継承の実装"か、"ASでの継承の実体"と書く方が適当ではないかとおもいます。 もうひとつ 引用: [註2] コンストラクタ関数内の話
。。。
言い換えると、"読もうとしたもの"が「存在しない」時は'__proto__'のショートカットからリンクを辿り、 "書こうとしたもの"が「存在しない」時はそれを新しく作っちゃう…といった具合です。
言い換えると、"読もうとしたもの"が「存在しない」時は'__proto__'のショートカットからリンクを辿り、 あればそれを返し、それでもなければundefineを返します。 また、"書こうとしたもの"が__proto__内に存在していても、 this直下に「存在しない」時はそれを新しく作っちゃう…といった具合です。 のほうが正確じゃないかと思いますです。 最後に、、prototypeや__proto__を隠ぺいするためにMX2004からはclassやextendsキーワードが使えるようになってますので その部分の説明はヘルプになくていいのだと思います、私的にはFlashのヘルプはだんだんよくなってきてると思いますよ。 ---------------- - yo
|
|
|
takiguchi |
Åê¹ÆNo.3697 投稿日時: 2004-2-11 14:53 |
半人前 居住地: 東京 投稿: 38
使用環境: Win2K,FlashMX2004Pro7.0.1
|
Re: クラス内の変数について 野中さん、ありがとうございます。 引用: 動作が理解できないときは、問題の部分のみ切分けて試した方がよいでしょう。 問題は、3回すべてではなく、obj1の2回分ですよね?
その通りです 主旨はそれだけでなのですが、 他の部分も全然自信が無くて、長々と書いてしまいました。 もし、読んで頂ける人がいれば、間違った考え方をしているところを指摘して頂けるかも… という甘えた考えからです。 色々試してはみたのですが、教えて頂いたように分解するような方法は私には全く思いも付かない方法でした。 prototype,__proto__,「参照型」など、腑に落ちない点が一杯有りますが、今まで教えて頂いた内容を元に理解を深めていきたいと思います。 また不用意な質問をしてしまいそうなので、今後質問は控えるようにします。 最後に一言…Flashのマニュアルもうちょっと頑張ってちょうだ?い
|
|
|
野中文雄 |
Åê¹ÆNo.3694 投稿日時: 2004-2-11 13:39 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境: CS5.5 .6.8 Vista Home Premium (SP1)
|
Re: クラス内の変数について 動作が理解できないときは、問題の部分のみ 切分けて試した方がよいでしょう。 問題は、3回すべてではなく、obj1の2回分ですよね? 引用: takiguchiさんは書きました: 下記のように__resolveが3回も呼ばれることです(うち2回がobj1) 教えてください…よろしくお願いいたします //ProtoExample.as
dynamic class ProtoExample{
//__proto__をシュミレートするObject _proto
var _proto:Object;
static var num:Number=0; //追加
var idName:String; //追加
function ProtoExample(proto:Object){
_proto = proto;
num++; //追加
idName="obj" + num; //追加
}
//もしProtoExampleのインスタンスに無いプロパティが呼び出されたら呼ばれる
function __resolve(prop:String){
trace([idName+".__resolve called","Prop:"+prop]); //追加
//引数に入ってきたものと同名のプロパティを_protoから探す
var f = _proto[prop];
//それがFunctionなら関数として返す。
if( typeof f== "Function")
return f.apply(this,arguments);
return f;
}
}
//example:
PROTOTYPE = new Object();
PROTOTYPE.prop = "prototypeProperty";
PROTOTYPE.datas = [1,2,3,4,5];
var obj1:ProtoExample = new ProtoExample(PROTOTYPE);
var obj2:ProtoExample = new ProtoExample(PROTOTYPE);
// [問題の処理部分]
obj1.datas[0] = "X"; //*datasプロパティの配列を参照して変更
// 問題はobj1の2回のみ
//obj1.__resolve called,Prop:datas
//obj1.__resolve called,Prop:datas
trace(obj1.datas); //X,2,3,4,5
[問題の処理部分]のステートメントをつぎのように分解すれば、おわかりになるでしょう。 // [問題の処理部分]
var temp = obj1.datas; //obj1.__resolve called,Prop:datas
temp[0] = "X";
//obj1.__resolve called,Prop:datas
trace(obj1.datas); //X,2,3,4,5
----------------
|
|
|
takiguchi |
Åê¹ÆNo.3693 投稿日時: 2004-2-11 11:51 |
半人前 居住地: 東京 投稿: 38
使用環境: Win2K,FlashMX2004Pro7.0.1
|
Re: クラス内の変数について こんにちは、度々すいません 以前、youichさんに教えて頂いたProtoExampleについて質問があります。 引用: protoypeや__proto__についての関係なんですが、 ASには__resolveという、そのオブジェクトに存在しないプロパティを 呼び出そうとしたときに呼び出されるメソッドがあります。… これ(ProtoExample.as)を使って考えると、もし?かしたらprototypeや__proto__の関係が すんなり解るかもしれません、ややこしそうなら飛ばして下さい。 「ProtoExample.prototypeをPROTOTYPEに、 obj1.__proto__をobj1._protoに置き換えて考えてみましょう!」 「ProtoExampleのようなことが、何者かによって私たちの見えないところで行なわれているのです!」 という、とらえ方で大丈夫でしょうか? あと…ProtoExampleに関して分からない事が1点あります。 下記のように__resolveが3回も呼ばれることです(うち2回がobj1) 教えてください…よろしくお願いいたします //ProtoExample.as
dynamic class ProtoExample{
//__proto__をシュミレートするObject _proto
var _proto:Object;
static var num:Number=0; //追加
var idName:String; //追加
function ProtoExample(proto:Object){
_proto = proto;
num++; //追加
idName="obj" + num; //追加
}
//もしProtoExampleのインスタンスに無いプロパティが呼び出されたら呼ばれる
function __resolve(prop:String){
trace([idName+".__resolve called","Prop:"+prop]); //追加
//引数に入ってきたものと同名のプロパティを_protoから探す
var f = _proto[prop];
//それがFunctionなら関数として返す。
if( typeof f== "Function")
return f.apply(this,arguments);
return f;
}
}
//example:
PROTOTYPE = new Object();
PROTOTYPE.prop = "prototypeProperty";
PROTOTYPE.datas = [1,2,3,4,5];
var obj1:ProtoExample = new ProtoExample(PROTOTYPE);
var obj2:ProtoExample = new ProtoExample(PROTOTYPE);
trace([obj1.idName,obj2.idName]); //obj1,obj2
//obj1.prop,obj2.propがないため__resolve2回呼ばれる
//obj2.__resolve called,Prop:prop
//obj1.__resolve called,Prop:prop
trace([obj1.prop,obj2.prop]); //prototypeProperty,prototypeProperty
//ex:obj1.prop = "instanceProperty";
obj1.prop = "instanceProperty"; //dynamicによりobj1.propプロパティ新規追加
//obj2.propがないため__resolve1回呼ばれる
//obj2.__resolve called,Prop:prop
trace([obj1.prop,obj2.prop]);//instanceProperty,prototypeProperty
//ex: obj1.__proto__.prop = "OOps...";
obj1._proto.prop = "OOps..."; //クラス内で定義されてるobj1._proto.propプロパティ書き換え
//obj2.propがないため__resolve1回呼ばれる
//obj2.__resolve called,Prop:prop
trace([obj1.prop,obj2.prop]); //instanceProperty,OOps...
//obj1.datas,obj2.datasがないため__resolve2回呼ばれる
//obj2.__resolve called,Prop:datas
//obj1.__resolve called,Prop:datas
trace([obj1.datas,obj2.datas]); //1,2,3,4,5 , 1,2,3,4,5
obj1.datas[0] = "X"; //dynamicによりobj1.datasプロパティ新規追加
//参照型のためPROTOTYPE.datasに設定した配列を変更することに…
////////////////////ここでなぜか__resolve3回呼ばれます////////////////////
//obj1.__resolve called,Prop:datas
//obj2.__resolve called,Prop:datas
//obj1.__resolve called,Prop:datas
trace([PROTOTYPE.datas,obj1.datas,obj2.datas]); //X,2,3,4,5 , X,2,3,4,5 , X,2,3,4,5
trace([obj1._proto.datas,obj2._proto.datas]); //X,2,3,4,5 , X,2,3,4,5
|
|
|
youich |
Åê¹ÆNo.3639 投稿日時: 2004-2-10 2:34 |
職人 居住地: kobe 投稿: 349
使用環境: Tiger
|
Re: クラス内の変数について 引用: 出口が見えかけてきました
あと2つです。 1)staticプロパティの位置
class Test{
static var staticProp:Number;
..
}
../Test/prototype/protoProp
../Test/prototype/instanceProp
../Test/staticProp
↑のようにstaticプロパティはTestの直下にきます
2)継承する時
class SuperTest{
var superProp:Number;
}
../SuperTest/prototype/superProp
class Test extends SuperTest{
....
}
SuperTestを継承するTestのクラス定義の時にはSuperTest/prototypeフォルダーのショートカットが
../Test/prototype/直下に __proto__と言う名前でできます。
../Test/prototype/__proto__
../Test/prototype/protoProp
../Test/prototype/instanceProp
(等々)
インスタンス化すると
../this/__proto__/__proto__/superProp
../this/__proto__/protoProp
../this/__proto__/instanceProp
となります。
これでAS1.0のprotoypeや__proto__について(AS2.0でもこれが実装)はほぼすべてです。 AS2.0ではclassキーワード等を使えるのでprototypeは表面にはでてきませんですが 実質的にはこれに書き換えられますので、知っていて損はないのではないかと。。。 ---------------- - yo
|
|
|
takiguchi |
Åê¹ÆNo.3635 投稿日時: 2004-2-10 0:17 |
半人前 居住地: 東京 投稿: 38
使用環境: Win2K,FlashMX2004Pro7.0.1
|
Re: クラス内の変数について youichさん、ありがとうございます。 引用: [クラス定義] Testクラスを定義するということは、Testフォルダーを作りその中にprototypeフォルダーを作りそして、 その中にファイルprotoPropやinstancePropを作ることになります。
../Test/prototype/protoProp ../Test/prototype/instanceProp (等々)
[インスタンス化] そして、それのインスタンス"this"を作った時は"this"フォルダーが作られ、 その下に../Test/prototypeフォルダーのショートカットが作られます。
../this/prototype そして、そのショートカットは__proto__とリネームされます。 ../this/__proto__
おお!…明日にでも早速修正しておきます。 あ!自分の頭の中も忘れずに軌道修正しておかないと… 一人で「こんな感じかな?」…あ!やっぱり違う! 「ということはこんな感じかな?」 みたいに自問自答していると、どんどん不安になって きちゃうんですけど、間違いを指摘していただけると スッキリした気分なります。 出口が見えかけてきました 本当に感謝です。
|
|
|
|
|