【问题标题】:JavaScript - Get Parent ObjectJavaScript - 获取父对象
【发布时间】:2013-09-27 21:40:58
【问题描述】:

我最近一直想探索一些 JavaScript 的数据结构,但我意识到我没有一个简单的方法来做到这一点。以下面的代码为例:

var a="asdf";

问题是,a 不存在于它自己的空间中。它实际上成为window 对象的一个​​属性。这导致了一些问题,例如“有任何东西拥有窗口对象吗?”和“控制台是附加到窗口的对象吗?”

我认为能够看到变量或对象的父对象(假设它存在)会非常好。有没有办法让控制台告诉你这个?

【问题讨论】:

  • 不,不是。您描述的效果实际上仅适用于全局对象。函数中的局部变量不是您可以操作或“看到”的任何对象的属性。

标签: javascript object data-structures


【解决方案1】:

每个 javascript 环境都有某种全局对象来“保存”全局变量和任何其他全局可访问的东西。在浏览器 javascript 环境中,这个全局对象是 window 对象。正如您所发现的,浏览器中的所有全局变量实际上都是window 对象的属性。在其他 javascript 环境中,例如服务器端 JS,全局对象不是窗口对象,但仍然有一个类似工作的全局对象(尽管它没有相同的内置浏览器窗口属性)。

没有通用的方法来查询变量并找出它的包含对象是什么。而且,在某些情况下(例如函数中的局部变量),没有可访问的 javascript 包含您可以从中访问变量的对象。

window 对象本身本质上由浏览器拥有或控制。每次浏览器打开一个新的浏览器窗口或标签时,它都会创建一个新的窗口对象。然后它将一个文档加载到该窗口对象中进行显示,然后该页面中的 javascript 可以访问 windowdocument 对象。

【讨论】:

  • 我发现真正有趣的是(请参阅我的答案的小字体部分)是语言确定全局对象的每个属性都是全局可访问的,但全局对象本身不需要可访问.为此,全局对象必须有一个属性持有对自身的引用(在浏览器中它被命名为“window”)。如果在函数词法环境对象上做同样的事情,我们也可以迭代局部变量。
【解决方案2】:

“有任何东西拥有窗口对象吗?”

是的,window 对象! :-) 试试这个:

window.window === window; // true

这很有趣,但这并不意味着window 实际上“拥有”自己。它包含对自身的引用,称为window,这就是使window 对象全局可用的原因。

控制台是附加到窗口的对象吗?

是的。

我认为能够看到变量或对象的父对象(假设它存在)会非常好。

这只能在全局 (window) 范围内实现。但您始终可以创建自己的对象并将它们用作命名空间。

【讨论】:

    【解决方案3】:

    使用命名空间。

    关于它的文章很多。例如,here

    定义一个命名空间:

    var AppSpace = AppSpace || {};
    

    那么所有的变量都会在这个命名空间下创建:

    AppSpace.Podcast = function {
        this.title = 'Astronomy Cast';
        this.description = 'A fact-based journey through the galaxy.';
        this.link = 'http://www.astronomycast.com';
    };
    
    AppSpace.Podcast.prototype.toString = function() {
        return 'Title: ' + this.title;
    }
    

    现在这些变量不会污染window 对象。如果页面中包含的 JS 文件碰巧在window 下使用相同的变量名,通常避免可能的名称冲突是一个好习惯。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2011-02-28
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2022-12-15
      • 2013-02-16
      相关资源
      最近更新 更多