// encode: shift_jis // // 注意: えーと、ただの一発ネタです (^^; // 遅いし。マジメに使わぬように。 // // arguments.caller という、規格ではもう廃止された // プロパティを使っています。ので、使用する際には // JavaScriptのバージョンとして新しすぎる数値を設定すると // 動作しません。対応バージョンは、1.3未満 です。 // // 中身は、要はcallerがthisのメンバかどうかチェックしてるだけ。 // メンバでなかった場合は undefined() で強制的にエラーを吐かせます。 // is_member : 補助関数 ///////////////////////////////// // fun(呼び出し元) が obj のコンストラクタか、 // // またはそのprototypeのメソッドな時にtrueを返す。 // // // // この関数を適宜書き換えることで、アクセスレベル // // の調整...オブジェクト固有のメソッドからの // // アクセスを許すかとか、protected化、とか、 // // ができます。 // ///////////////////////////////////////////////////////// function is_member(obj, fun) { if(fun === obj.constructor) return true; for(i in obj.constructor.prototype) if(fun === obj.constructor.prototype[i]) return true; // for(i in obj.__proto__) // if(fun === obj.__proto__[i]) // return true; return false; } // private_var : thisのprivate変数を定義する関数 //////// // 名前 "x" に対し、読み書き用にプロパティ // // this.x() と this.set_x(値) を定義します。 // // // // このメソッド自身もprivate化されています。 // ///////////////////////////////////////////////////////// Object.prototype.private_var = function(name, initval) { if( !is_member(this, arguments.callee.caller) ) undefined(); var x = initval; this[name] = function() { if( !is_member(this, arguments.callee.caller) ) undefined(); return x; } this["set_"+name] = function(xx) { if( !is_member(this, arguments.callee.caller) ) undefined(); x = xx; } } //--------------- てすとこーど ---------------------// function MyObject(xx,yy) { this.private_var("x", xx); this.private_var("y", yy); } MyObject.prototype.getXplusY = function() { return this.x() + this.y(); } var p = new MyObject(100,200); var q = new MyObject(300,400); document.writeln( p.getXplusY() ); document.writeln( q.getXplusY() ); //document.writeln( p.x() + p.y() );