一个javascript对象,它本身的父对象?

时间:2014-09-01 00:14:31

标签: javascript object inheritance prototype

我正在编写一个抓取和数据录入计划,以拯救我的妈妈和她的同事几个小时的麻木重复形式的提交。一切都很顺利,直到我在提交按钮上进行了这个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画......

我不知道发生了什么或者它是如何运作的......对此非常感激...

2 个答案:

答案 0 :(得分:1)

constructor是创建对象的函数。它不是继承意义上的父级。更好的是,parent不是对象的父级,它是(除非另外定义)窗口的父级(如果你有框架或iframe)。如果没有定义其他内容,则此代码应查看父窗口(如果存在)是否具有dataLoggerP函数(非对象),如果有,则执行它。如果没有父窗口,或者它没有定义dataLoggerP函数,则没有任何反应,没有错误,因为它全部包含在支票中。

答案 1 :(得分:0)

它只是一个circular reference。举个简单的例子,在控制台中检查这个对象

var obj = {}
obj.x = obj;

您发现的这个特定示例适用于javascript中的任何函数。所有javascript函数都有prototype属性,该属性是一个带有constructor字段的对象,指向原始函数。