JavaScript. возможно ли для одного члена объекта доступ к другому члену этого объекта без явной ссылки на сам объект? - PullRequest
1 голос
/ 18 апреля 2010

Например:

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 ]

1 голос
/ 18 апреля 2010

Чтобы вызвать ваш asGlobal, вам нужно сделать:

asGlobal.call(myObj);

ECMAScript 5 представит метод bind() для обеспечения контекста функции. Это позволит вам сделать следующее:

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

Однако bind() пока не поддерживается в текущих браузерах, насколько я знаю. А пока вы можете попробовать реализацию Prototype bind , которая практически идентична методу ECMAScript 5.

0 голосов
/ 18 апреля 2010

Попался! Затворы преуспевают

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(); 
0 голосов
/ 18 апреля 2010
var asGlobal = function(){myObj.asMember();}

Если myObj изменится на другой объект, функция будет использовать последнее значение. Если вы не хотите этого, попробуйте:

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