インスタンスに依存した初期値を持つ書き換え可能propertyの定義
インスタンスに依存してなければこれで済むから簡単ですよねー
function A(){} var proto = A.prototype; Object.defineProperty(proto,'key',{ value : 'default', writable : true });
インスタンスに依存している場合はprototype定義時にそのインスタンスが存在しないのでvalueで初期値を定義できません。
単純なコードだと、実際の値を保持する別propertyとget/setを定義して、まだ保持していなかったら設定するとかそうなるでしょう。
function foo(val) { // valの内容によって戻り値が変わると思いねえ return 'default'; } function A(){} var proto = A.prototype; Object.defineProperty(proto,'key',{ get : function () { var self = this; if (self._key === undefined) { self._key = foo(self); } return self._key; }, set : function (val) { var self = this; self._key = val; } });
しかし、無駄にpropertyを増やしたくありません。
こうします。
prototypeに対してconfigurable:trueにしてget/setありのpropertyを定義、
その中でインスタンスの(!=prototypeの)propertyを上書き定義します。
function foo(val) { // valの内容によって戻り値が変わると思いねえ return 'default'; } function A(){} var proto = A.prototype; Object.defineProperty(proto,'key',{ get : function () { var self = this; var val = foo(self); Object.defineProperty(self,'key',{ value:val, writable:true }); return val; }, set : function (val) { var self = this; Object.defineProperty(self,'key',{ value:val, writable:true }); }, configurable : true });
ばっちり動きますね
a= new A; b= new A; a.key; // 'default' a.key= 1; a.key; // 1 b.key; // 'default'