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向导,所以这对其他人来说可能相当明显。 有人会关心这个吗?
答案 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是未定义的。