这如何成为递归构造?

时间:2014-11-14 14:29:39

标签: javascript recursion

app使用和旧版本的prototype.js(1.3),有这个:

Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.prototype.extend = function(object) {
  return Object.extend.apply(this, [this, object]);
}

现在通常这样可以正常工作,但有时最后一个函数会递归并调用自身,直到超出调用堆栈大小。 当然,我不是一个javascript向导,所以这对其他人来说可能相当明显。 有人会关心这个吗?

1 个答案:

答案 0 :(得分:1)

如果使用myObject.propertyName访问对象的属性,则JS首先查看myObject的自己的属性。如果找到具有该propertyName的那个,则将其删除。只有当它没有找到时,JS才会在原型(以及后来的整个原型链)中进行搜索,如果那里存在具有该名称的属性。

这就是为什么在对象上直接拥有属性extend而在原型上有同名的另一个属性通常是个坏主意,因为后者不是被遮蔽首先,因此没用。

使用赋值Object.extend = function() {...};,该函数被设置为本机Object构造函数的自己的属性。现在当你Object.extend(..)执行该函数时,可能会有一个Object.prototype.extend。

只有当没有自己的属性extend 时,.prototype.extend才会发挥作用并在执行Object.extend(...)时执行。那个原型函数里面会发生什么?首先查看对象自己的extend,并且找不到.prototype.extend的调用:递归就在那里。

如果发生有时,那么那时 Object.extend是未定义的。