動作が理解できないときは、問題の部分のみ
切分けて試した方がよいでしょう。
問題は、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
----------------