0

この抜粋を見てください:

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();
};

}

4

1 に答える 1

1

問題は、元のオブジェクトへの参照を含むtransformMap( )内の特定の変数を参照していることです。transformatorこの意味を理解するには、次のことを行った場合に何が起こるかを考えてください。

var foo = transformator;
transformator = null;
foo.transformMap();

transformator現在はnullプロパティがないため、エラーが発生しtransformMapHeadます。


this代わりに使用する必要があります:

return this.transformMapHead(tree)
       +this.transformMapBody(tree.body[0].body) +"}\n";

現在のオブジェクトを参照します。

の詳細をご覧くださいthis

于 2012-09-29T20:45:06.577 に答える