プロパティを直接使用するのではなく、getter および setter 関数を使用することから始めます。
var fruitType = {
"apple": 0,
"orange": 1
};
var fruit = function(name) {
this.setName(name);
};
fruit.prototype.getName = function(){
return this.name;
}
fruit.prototype.setName = function(name){
if (name in fruitType) {
this.name = name;
} else {
throw "wrong fruit type";
}
};
直接オーバーライドすることもできますf.name
が、一貫性があり、セッターを使用している限り、問題は発生しません。
var f = new fruit("apple");
f.setName('orange'); // OK
f.setName('toast'); // Throws an error
f.name = 'toast'; // This works, so don't do it!
JSFiddle (ダークナイトに感謝)
それがうまくいかないことが重要な場合は、フルーツ オブジェクトごとに個別の関数を、プライベート スコープの変数f.name = 'toast'
と共に使用できます。name
var fruitType = {
"apple": 0,
"orange": 1
};
var fruit = function(name) {
this.getName = function(){
return name;
}
this.setName = function(newName){
if (newName in fruitType) {
name = newName;
} else {
throw "wrong fruit type";
}
};
this.setName(name);
};
これには、すべてのフルーツが関数の独自のコピーを必要とするという欠点がありますが、name
変数を変更する唯一の方法はセッターを使用することであるという利点があります。
var f = new fruit("apple");
f.setName('orange'); // OK
f.setName('toast'); // Throws an error
f.name = 'toast'; // This sets the `name` property to 'toast', but:
f.getName(); // this will still return 'orange'
JSFiddle