JavaScript继承:“模板方法”模式和覆盖函数

时间:2012-09-29 20:43:04

标签: javascript inheritance

看看这个剪辑:

transformator 带有 transformMap() -method。此方法调用转换器的另外两个方法: transformMapHead() transformMapBody()

transformator

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() -method是完全实现的, transformMapHead() -method不是,这将在子对象中完成。

现在,让我们来看看更具体的转换器。这里我只想实现 transformMapHead() -method。

但是,当我实施

concreteTransformator

var concreteTransformator = Object.beget(transformator);                            

concreteTransformator.transformMapHead = function(tree)
{
    // my business logic
    console.log("i am the new business logic");
};

它无法正常工作。而不是从 concreteTransformator - 对象运行 transformMapHead() - 方法,而是执行第一个转换器对象中的方法并且“将成为完成“打印出来。

我可以通过将 transformMap() -method从transformer-object复制到 concreteTransformer -object来避免这种情况:

concreteTransformator.transformMap =  function(tree) {
    return concreteTransformator.transformMapHead(tree)
          +concreteTransformator.transformMapBody(tree.body[0].body) +"}\n";
};

然后,一切都运行良好,但这不是可行的方法?!

最后,Douglas Crockford的beget-helper函数:

if (typeof Object.beget !== 'function') {
Object.beget = function(o) {
    var F = function() {};
    F.prototype = o;
    return new F();
};

}

1 个答案:

答案 0 :(得分:1)

问题是您引用transformMaptransformator)中的特定变量,其中包含对原始对象的引用。要了解其含义,请考虑如果您这样做会发生什么:

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

您会收到错误,因为transformator现在为null,因此不再拥有属性transformMapHead


您应该使用this代替:

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

引用当前对象。

Learn more about this