JavaScript的。一个对象的一个​​成员是否有可能访问该对象的另一个成员而没有明确引用该对象本身?

时间:2010-04-18 15:57:00

标签: javascript class object methods closures

例如:

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不会改变,应该继续工作)

3 个答案:

答案 0 :(得分:1)

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

asGlobal.call(myObj);

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

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

但据我所知,目前的浏览器尚不支持bind()。在此期间,您可能需要查看Prototype's bind实现,这与ECMAScript 5方法几乎完全相同。

答案 1 :(得分:0)

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

如果myObj更改为其他对象,则该函数将使用最新值。如果你不想这样,试试:

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

答案 2 :(得分:0)

疑难杂症! 关闭做得很好

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(); 
相关问题