【问题标题】:javascript. is it posible for one member of an object to access another member of that object without explicit reference to the object itself?javascript。对象的一个​​成员是否可以访问该对象的另一个成员而无需显式引用对象本身?
【发布时间】:2010-04-18 15:57:00
【问题描述】:

例如:

var myObj={

  myValue="hola",

  asMember=function(){ alert( this.myValue ); }

};


myObj.asMember(); // will work fine

var asGlobal=myObj.asMember; // global alias for that member function
asGlobal(); // won't work in javascript (will work in AS3, but i need js now)

所以问题是,我可以重写asMember 以便可以通过全局别名调用它而不提及myObj 吗?据了解,如果我定义它:

asMember=function(){ alert( myObj.myValue ); }

它会起作用,但在我的情况下,即使在函数本身内部也不能接受 myObj(因为稍后可能会重新分配 myObj,但 asGlobal 不会改变并且应该继续工作)

【问题讨论】:

    标签: javascript class object methods closures


    【解决方案1】:

    要调用您的asGlobal,您需要执行以下操作:

    asGlobal.call(myObj);
    

    ECMAScript 5 将引入 bind() 方法来强制执行函数的上下文。这将允许您执行以下操作:

    var asGlobal = myObj.asMember.bind(myObj);
    asGlobal();
    

    但是,据我所知,当前的浏览器尚不支持bind()。同时,您可能想查看Prototype's bind 实现,它与 ECMAScript 5 方法几乎相同。

    【讨论】:

      【解决方案2】:
      var asGlobal = function(){myObj.asMember();}
      

      如果 myObj 更改为不同的对象,该函数将使用最新的值。如果您不想要这个,请尝试:

      var asGlobal = function(o){return function(){o.asMember();}}(myObj);
      

      【讨论】:

      • 诺诺。 asGlobal 必须只是 asMethod 的别名。我唯一可以做的就是改变asMethod,让它知道自己是myObj的成员
      【解决方案3】:

      明白了! 闭包做得很好

      function myObj(){
      
        var myValue="hola";
      
        return{
          asMember:function(){ alert( myValue ); },
          anotherMemer:function(){/* ... */}
        }
      
      };
      
      var temp=myObj();
      
      var asGlobal=temp.asMember; // global alias for that member function
      asGlobal(); 
      

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多