Jintrick.netagenda2008年02月アーカイブ → 2008年02月06日

Object.prototype.watchメソッドでプロパティへのアクセスを制限

次の例は、Object.prototype.watchメソッドを使ってプロパティが変更されたときに呼び出した関数オブジェクトをチェックして、nextメソッド経由以外からの変更をキャンセルしている。

指定したメソッド以外からのプロパティ値変更をキャンセル

function Shelf(){
    this.index = 0;
    this.watch("index", function(id,oldV,newV){
        if ( arguments.callee.caller === this.next )
            return newV;
        else
            return oldV;
    });
} let (__proto__ = Shelf.prototype) {
    __proto__.next = function(){
        this.index++;
    };
}

var shelf = new Shelf();
shelf.index = 1;
alert(shelf.index); // 0
shelf.next();
alert(shelf.index); // 1

watchメソッドに指定したコールバック関数の戻り値が、プロパティにセットされる値になる。呼び出し元(arguments.callee.caller)がnextメソッド以外なら、元の値(oldV)が返されるためプロパティの値に変化はなく、結果nextメソッド経由以外は受け付けないわけだ。これで一応プライベートっぽいプロパティを作れるが、パフォーマンス的にクロージャを使ったほうが良いケースが多くて今一。


webmaster@jintrick.net
公開: 2008年02月06日
カテゴリ: Javascript