transformator 带有 transformMap() -method。此方法调用转换器的另外两个方法: 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() -method是完全实现的, transformMapHead() -method不是,这将在子对象中完成。
现在,让我们来看看更具体的转换器。这里我只想实现 transformMapHead() -method。
但是,当我实施
时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();
};
}
答案 0 :(得分: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";
引用当前对象。