こんにちは、度々すいません
以前、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