[javascript] private変数をつくる、その2

こんばんわ。
サッカーを見ている最中のおじいさんです。名古屋がまけてしまいましたorz
それはともかく、前回の続き。

継承してみました。


<html>
<body>
クロージャを利用した隠蔽化<br>
<script>
//////////////////////////////////////////
// 継承
//////////////////////////////////////////
$extend = function(d,s) {
d = d.prototype;
s = s.prototype;
d.superClass = s;
for (p in s) if (!d[p]) d[p] = s[p];
};
//////////////////////////////////////////
// SimpleObj
//////////////////////////////////////////
function SimpleObj() {}
var obj = new SimpleObj();

SimpleObj.prototype = {
  create : function() {
    document.write("SimpleObj:create<br>");
    var myprivate = {
      private_var1: 1,
      private_func1:function(){}
    };
    var mypublic = {
      public_var1:3,
      public_func1:function() {
        document.write("Simpleobj:public_func1:"+myprivate.private_var1+"<br>");
      },
    };
    for (var p in mypublic) { if (!this[p]) this[p] = mypublic[p] };//publicな変数や関数を設定
    
  }
};

//////////////////////////////////////////
// exSimpleObj
//////////////////////////////////////////
function exSimpleObj() {}
var obj = new exSimpleObj();

exSimpleObj.prototype = {
  create : function() {
    document.write("exSimpleObj:create<br>");
    var myprivate = {//var をつけないとグローバル扱いになるので注意
      private_var1: 4,
      private_func1:function() {
        document.write("exprivate_func1:"+myprivate.private_var1+"<br>");
      }
    };
    var mypublic = {
      ex_public_var1:6,
      ex_public_func1:function() {
        document.write("exSimpleobj:ex_public_func1:"+mypublic.ex_public_var1+"<br>");
      },
    };
    for (var p in mypublic) { if (!this[p]) this[p] = mypublic[p] };//publicな変数や関数を設定
    this.superClass.create.apply(this);// 親クラスのコンストラクタを呼び出し、publicの設定をする
                                       // applyを使わないと、親クラスの中ではSimpleObjとして扱われるので
                                       // こうしないとだめ。
    
  }
};
$extend(exSimpleObj,SimpleObj);

/////////////////////////////////////////////////
// Maincode
/////////////////////////////////////////////////
var ex1 = new exSimpleObj();
ex1.create();
ex1.public_func1();
ex1.ex_public_func1();
</script>
</body>
</html>



まあ、なんとかできているとは思います。
で、protectedな変数なんですが、今の所作る方法を理解できず、思いつかず。
自分の子クラスだったら、protectedな変数のハッシュを返却するような動きをしたいんですが、文字列以外で、自分の子クラスであるという判定が思いついていません。
うーん、どうすりゃいいんだろ??


ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

Farsse
2007年04月09日 19:11
親クラスと継承方法を返す関数作れませんかね?
子クラスの create で、親クラスと継承方法のリスト埋め込まないといけませんが。
で、継承関係を逆に辿っていって、子クラスか Public 継承の子クラスの子クラスなら、protected 変数を返す、そうではないなら返さない。
できる?

# 面倒くさいので javascript の詳細はノータッチ・・・ (汗
2007年04月09日 22:49
うーん、言語に実装されていない機能なんで、なかなか安心して使えないのよ。
色々やってる最中(^-^;)

この記事へのトラックバック