2020年04月14日

JavaScript プライベートメンバとアクセサーメソッドの実装例

definePropertyを使わない例
// プライベートメンバの定義例
'use strict';

// 点数を保持する
var Score = function(){
// プライベートプロパティ
var _val; // this._valではない!

var _chkVal = function(val){
return (typeof val === 'number' && 0 <= val && val <= 100);
}
// プライベートメンバにアクセスするためのメソッド(特権メソッドと呼ぶ)。
// this.を付けて記述する。
this.setVal = function(arg){
if(_chkVal(arg)){_val = arg;}
}
this.getVal = function(){
return _val;
}
}

var scr1 = new Score();
scr1._val = 50; // プロパティは追加できるが、getVal()からは参照しない。
scr1.setVal(99);
console.log(scr1.getVal());
definePropertyによるアクセサーメソッド
// definePropertyによるアクセサーメソッドの例
'use strict';

// 点数を保持する
var Score = function(){
// プライベート変数
var _val;

var _chkVal = function(val){
return (typeof val === 'number' && 0 <= val && val <= 100);
}
Object.defineProperty(
this,
'val',
{
get: function(){
return _val;
},
set: function(arg){
if(_chkVal(arg)){
_val = arg;
}
},
}
);
}

var scr1 = new Score();
scr1.val = 88;
console.log(scr1.val);

var scr2 = new Score();
scr2.val = -50; // チェックで弾かれる
console.log(scr2.val); // undefined
definePropertiesによるアクセサーメソッド
// definePropertiesによるアクセサーメソッドの例
'use strict';

// 点数を保持する
var Score = function(){
// プライベート変数
var _val;

var _chkVal = function(val){
return (typeof val === 'number' && 0 <= val && val <= 100);
}
Object.defineProperties(
this, {
val: {
get: function(){
return _val;
},
set: function(arg){
if(_chkVal(arg)){
_val = arg;
}
},
},
// 2つめ以降のアクセサーを記述する。
}
);
}

var scr1 = new Score();
scr1.val = 77;
console.log(scr1.val);

タグ:JavaScript
posted by Hiro at 22:40| Comment(0) | プログラム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: