0

看看这个截图:

有一个带有transformMap ()方法的转换器。此方法调用变换器的另外两个方法: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");
};

它不能正常工作。不是从concreteTransformator对象运行transformMapHead()方法,而是执行第一个transformator对象的方法并打印出“待完成”。

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

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

您会收到一个错误,因为transformatoris nullnow 因此不再具有属性transformMapHead


您应该this改用:

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

引用当前对象。

了解更多关于this.

于 2012-09-29T20:45:06.577 回答