【问题标题】:Where does property when added to function object添加到函数对象时属性在哪里
【发布时间】:2014-10-31 21:58:51
【问题描述】:
function foo()
{
       var a=5;
 }

由于上述函数是 JavaScript 对象,因此我们可以向其添加属性,例如 foo.p=6。但是在执行 console.log(foo) 时,我无法看到对象的 p 属性,但可以通过 foo.p 和 foo[ 'p']。

如果我们将 foo 视为 JavaScript 对象,我也无法访问 foo.a

【问题讨论】:

    标签: javascript function javascript-objects


    【解决方案1】:

    “a”是一个局部变量,不能从函数外部访问。

    你想要这样的东西:

    var myClass = function(){
    this.foo = 'bar';
    }
    
    var myInstance = myClass();
    myInstance.foo // 'bar'
    

    或作为普通对象:

    var myObj = {
    foo: 'bar'
    }
    
    myObj.foo // 'bar'
    myObj.foo = 123;
    myObj.foo // 123
    

    【讨论】:

    • a 不等于 p。请仔细阅读问题;)
    • 但是 p 不是他的 foo() 函数中的变量。
    • 正确。 OP 正在尝试在函数对象上设置一个属性,并询问它为什么不显示。
    【解决方案2】:

    实现这一目标的方法很少。一种是在 Javascript 中使用对象,另一种是使用所谓的“模块模式”。 对于使用对象,您可以这样做:

    function MyObject() {
      this.foo = "myObj";
    }
    var mo = new MyObject();
    console.log(mo.foo); //Will print "myObj".
    

    模块模式的工作原理如下:

    var MP = (function(){}(
      var foo = "MP";
      return {
        foo : foo
      }
    
    ));
    console.log(MP.foo); // Will print "MP"
    

    【讨论】:

    • 这不是被问到的问题。很好的答案,但题外话;)
    【解决方案3】:

    改用console.dir(foo);,它会列出对象的属性。 concole.log 只是输出一些值的表示,浏览器认为会有用。

    foo.a 无法工作。 a 是一个本地变量,不是属性,并且仅在执行foo 时存在。

    【讨论】:

    • 看最后一句话。
    • 哇 >_> 所以最后一句话是一个完全独立的问题。我的错。
    【解决方案4】:

    当记录一个对象时,浏览器会选择如何在控制台中渲染它。这可能像在其上调用 .toString() 一样简单,也可能像让您能够导航其属性一样复杂。

    此外,控制台不是标准。浏览器可以随心所欲地实现它,尽管为方便起见,它们将保持通用样式。然而,最终,这意味着它们会有所不同。

    Internet Explorer:

    谷歌浏览器:

    请注意,我必须使用 console.dir() 来强制 Chrome 为我提供对象的可导航视图,而不是其简单的 .toString() 表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2021-09-19
      相关资源
      最近更新 更多