我正在编写一个抓取和数据录入计划,以拯救我的妈妈和她的同事几个小时的麻木重复形式的提交。一切都很顺利,直到我在提交按钮上进行了这个onclick函数调用。该函数(出于安全目的我们称之为dataLogger())将单个输入字段条目作为参数然后......我不知道......因为它引用了一个实质上称之为“39”的函数。 ;父母的构造函数......就像这样(函数名被换掉):
dataLogger(data) {
if (parent)
if (typeof(parent.dataLoggerP) == 'function')
parent.dataLoggerP(data);
所以我在这个函数上放了一个断点并检查了" dataLogger"萤火虫中的物体。我想我会查看原型节点的子节点,参见" dataLoggerP"父级的功能,搜索该功能定义,并解决我的问题。但有趣的事情发生了。我会在Watch Expressions中单击firebug中的prototype:
节点,并在其中查看两个节点:constructor: dataLogger(data)
和__proto__:
。我打开constructor: dataLogger(data)
节点只是为了发现它是原始dataLogger对象的副本!在那一个中,还有另一个......而另一个......到无穷大。它就像一幅mc escher画......
我不知道发生了什么或者它是如何运作的......对此非常感激...
答案 0 :(得分:1)
constructor
是创建对象的函数。它不是继承意义上的父级。更好的是,parent
不是对象的父级,它是(除非另外定义)窗口的父级(如果你有框架或iframe)。如果没有定义其他内容,则此代码应查看父窗口(如果存在)是否具有dataLoggerP
函数(非对象),如果有,则执行它。如果没有父窗口,或者它没有定义dataLoggerP
函数,则没有任何反应,没有错误,因为它全部包含在支票中。
答案 1 :(得分:0)
它只是一个circular reference。举个简单的例子,在控制台中检查这个对象
var obj = {}
obj.x = obj;
您发现的这个特定示例适用于javascript中的任何函数。所有javascript函数都有prototype
属性,该属性是一个带有constructor
字段的对象,指向原始函数。