【问题标题】:A javascript object that is a parent of itself?一个作为自身父级的 javascript 对象?
【发布时间】:2014-09-01 00:14:30
【问题描述】:

我正在编写一个抓取和数据输入程序,以节省我妈妈和她的同事数小时的时间,让他们费时费力地重复提交表单。一切都很顺利,直到我在提交按钮上调用了这个 onclick 函数。该函数(出于安全目的我们将其称为 dataLogger() )将单个输入字段条目作为参数,然后......我不知道......因为它引用了一个本质上调用它的父构造函数的函数.. . 像这样(换出函数名):

dataLogger(data) {
   if (parent)
        if (typeof(parent.dataLoggerP) == 'function')
            parent.dataLoggerP(data);

所以我在这个函数处设置了一个断点,并在 firebug 中检查了“dataLogger”对象。我想我只需查看原型节点的子节点,查看父节点的“dataLoggerP”函数,搜索该函数定义,然后解决我的问题。但是发生了一件有趣的事情。我会在 Watch Expressions 中单击 firebug 中的 prototype: 节点,并在其中看到两个节点:constructor: dataLogger(data)__proto__:。我打开constructor: dataLogger(data) 节点却发现它是原始dataLogger 对象的副本!在那个里面,还有另一个……还有另一个……无穷无尽。这就像一幅 mc escher 的画……

我不知道发生了什么,也不知道它是如何工作的......非常感谢任何对此的见解......

【问题讨论】:

  • 另外,我刚刚在手表表达式中添加了parent,找不到像这个函数应该调用的dataLoggerP(data)对象,只有dataLogger(data)(没有“P”最后)再次将自身原型化为无穷大的对象!

标签: javascript object inheritance prototype


【解决方案1】:

constructor 是创建对象的函数。它不是继承意义上的父级。更好的是,parent 不是对象的父对象,它是(除非另有定义)window 的父对象(如果您有框架或 iframe)。这段代码,如果没有定义其他内容,应该查看父窗口(如果存在)是否有dataLoggerP 函数(不是对象),如果有,则执行它。如果没有父窗口,或者它没有定义dataLoggerP 函数,则不会发生任何事情,也不会出错,因为它都包含在检查中。

【讨论】:

  • 好吧,如果是这样,当我在 firebug 中进行全局搜索时,为什么 dataLoggerP 无处可寻?这个函数也可以工作......它将数据提交到某种数据库,但由于我找不到函数dataLoggerP(),我无法知道数据会发生什么。在这种情况下,我可能会在哪里找到dataLoggerP()
  • 对不起,没有更多细节,我只能说。如果存在,它将位于parent。如果您没有另一个parent 变量,那就是window.parent。检查函数内部是否为window.parent === parent。另外,我对 Firebug 不太熟悉(我是 Chrome 类型的人),也不知道全局搜索。尝试在“网络”选项卡中查看为您的页面加载的所有 JavaScript 和 HTML 文件。如果它不存在,它很可能不存在(它可能隐藏在某处、解密和评估,但这不太可能)。
  • 今天是我第一次使用 firefox 调试器,而且我之前只使用过 chrome...如果你没有使用过,绝对值得一试,它的速度更快,功能更多。我刚刚检查了parent 里面并没有dataLoggerP()。如果它被隐藏了,有什么办法可以取消隐藏并访问它的内容?
  • 另外你知道我在哪里可以找到更多关于在 javascript 中加密和解密代码块的信息吗?我无法理解浏览器是如何知道的,例如,dataLoggerP() 是对加密函数的调用,因此需要在运行前解密……我的意思是它看起来像一个完全正常的函数调用。 . 魔法发生在哪里?
  • 正如我所说,(加密的代码)几乎从未发生过,所以我认为这不是正在发生的事情......但是浏览器不会知道它已被加密,其他一些代码会在调用它之前对其进行解密和评估。尝试在dataLogger 中设置断点,看看parent 是什么,是否有dataLoggerP。无法隐藏;它存在或不存在。看其他时间真的不值得。除此之外,除了你写的东西之外,对你的代码一无所知,我只能这么说。
【解决方案2】:

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

var obj = {}
obj.x = obj;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2012-01-18
    • 2015-10-03
    相关资源
    最近更新 更多