_data
作成されたすべてのオブジェクトの定義として、プロパティをプロトタイプに保存しました。
function A() {}
A.prototype._data = [];
から作成されたすべてのオブジェクトには、A
プロパティがあります_data
。
プロトタイプがプロトタイプ チェーン内のすべてのプロトタイプからの値_data
を持つプロトタイプの継承が必要です。_data
直接的な方法はわかりません。この例では getter を使用していget()
ます。
function A() {}
A.prototype._data = [];
A.prototype.add = function(rec) {
this.__proto__._data.push(rec);
}
A.prototype.get = function() {
if(typeof this.__proto__.constructor.prototype.get == 'function')
{
return this.__proto__.constructor.prototype.get().concat(this.__proto__._data);
}
else
{
return this.__proto__._data || [];
}
}
function B() {}
B.prototype = Object.create(A.prototype, { constructor: { value: B }});
B.prototype._data = [];
値を持つオブジェクトと値を持つa
オブジェクトを作成すると、が返されます。そして後でプロトタイプが で拡張される場合、関数は を返します。aa
b
bb
b.get()
[aa, bb]
_data
A
aaaa
b.get()
[aa, aaaa, bb]
var a = new A(), b = new B();
a.add('aa');
b.add('bb');
console.log(b.get()); // [aa, bb]
a.add('aaaa');
console.log(b.get()); // [aa, aaaa, bb]
// EDITED - _data in A prototype shoud be without B
console.log(a.get()); // [aa, aaaa]
これを達成するための良い(標準的な)方法はありますか?コンストラクターの修正を使用しObject.create
、親プロトタイプをconstructor.prototype
?で参照することを意味します。
ここにデモがあります:http://jsfiddle.net/j9fKP/
このすべての理由は、スキームの継承が許可されている ORM ライブラリのスキームのフィールド定義にあります。子スキームには、親スキームのすべてのフィールドが必要です。