この抜粋を見てください:
transformMap()メソッドを持つトランスフォーマーがあります。このメソッドは、トランスフォーマーの他の 2 つのメソッド、transformMapHead()およびtransformMapBody()を呼び出します。
トランスフォーマー
var transformator =
{
transformMap: function(tree) {
return transformator.transformMapHead(tree)
+transformator.transformMapBody(tree.body[0].body) +"}\n";
},
transformMapHead: function(tree) {
return "to be done";
},
transformMapBody: function(tree) {
// completly implemented
},
...
};
わかりました。ここまでは問題ありません。transformMapBody()メソッドは完全に実装されていますが、transformMapHead ()メソッドは実装されていません。これは子オブジェクトで行われます。
では、より具体的なトランスフォーマーを見てみましょう。ここでは、 transformMapHead()メソッドのみを実装します。
しかし、私が実装すると
コンクリートトランスフォーマー
var concreteTransformator = Object.beget(transformator);
concreteTransformator.transformMapHead = function(tree)
{
// my business logic
console.log("i am the new business logic");
};
正しく動作しません。具体的なTransformator オブジェクトからtransformMapHead()メソッドを実行する代わりに、最初の Transformator オブジェクトからのメソッドが実行され、"to be done" が出力されます。
これは、 transformMap()メソッドをTransformerオブジェクトからconcreteTransformerオブジェクトにコピーすることで回避できます。
concreteTransformator.transformMap = function(tree) {
return concreteTransformator.transformMapHead(tree)
+concreteTransformator.transformMapBody(tree.body[0].body) +"}\n";
};
その後、すべてが正常に動作しますが、これは進むべき道ではありません?!
最後に、Douglas Crockford による beget-helper-function:
if (typeof Object.beget !== 'function') {
Object.beget = function(o) {
var F = function() {};
F.prototype = o;
return new F();
};
}