次のようなパターンを考えてみましょう。プロパティの getter/setter インターフェイスを定義して、内部検証を非表示にする必要があります。
var validThings = {
'pretty name a': 3293293,
'pretty name b': 8275850,
'pretty name c': 2983855
};
function Constructor() {
var internalThing = {
name: 'pretty name a',
id: '3293293'
};
Object.defineProperty(this, 'thing', {
get: function() { return internalThing.name; },
set: function(val) {
var id = validThings[val];
if (id) internalThing = { name: val, id: id };
}
});
}
これにより、ID について心配する必要がなくなり、次のように「もの」を設定できます。
var constructoid = new Constructor();
constructoid.thing = 'pretty name b';
constructoid.thing; // 'pretty name b';
そしてもちろん、無効な値に設定するのを防ぎます:
constructoid.thing = 'pretty name d';
constructoid.thing; // 'pretty name b';
しかし、オブジェクトの外部からも ID にアクセスできるようにしたいとしましょう。そのための最も自然なインターフェースは、モノのプロパティとしてです
constructoid.thing.id
しかし、「物」自体がゲッター/セッターである場合、そのようなプロパティを定義するにはどうすればよいでしょうか? 私は、関数、配列、アイスクリームコーンなど、JS で必要に応じて何でもプロパティをスローできることに慣れています。しかし、この場合、少なくとも私が考えることができた方法では不可能のようです。
Object.defineProperty(this.thing, 'id', {...}) // <-- error
もちろん、Constructor オブジェクト自体に「thingID」などのプロパティを単純に定義することも、モノの getter から名前と ID の両方を返すこともできます。私はそのような解決策を探しているわけではありませんが、明らかです。これは、定義されたプロパティでプロパティを定義することが実際に可能かどうかについての仮説的な質問です。