2014-11-09 4 views
1

я получил два объекта, т.е.Изменение поведения этого внутри объекта

var Parent = { }; 

var Child = { 
    born : function() { 
     Parent.beHappy = this.study; 
    }, 

    study : function() { 
     console.log("Studying!"); 
     console.log("Now I'm going to play"); 
     this.play(); 
    }, 

    play : function() { 
     console.log("Playing!"); 
    } 
} 

Теперь, что я делаю

Child.born(); 
Parent.beHappy(); 

Как вы можете видеть Parent.beHappy() вызывает study метод ребенка. Теперь проблема, которую я испытываю, заключается в методе study, который я не могу назвать this.play(). И причина, почему это так, потому что study() вызывается на Parent, и поэтому this здесь относится к Parent вместо Child. Есть ли способ, который я могу сделать this в методе study, всегда относится к Child, а не к Parent? Я знаю, что могу сделать Child.play() в методе study, чтобы он работал, но я хотел бы быть последовательным во всем моем коде и предпочел бы this. Кроме того, я мог бы сделать $.proxy(Parent.beHappy, Child)(), но я не хочу менять этот вызов функции Parent.beHappy(), потому что он будет использоваться конечным пользователем. Я пробовал все, и теперь у меня нет идей. Любые предложения будут высоко оценены.

+0

он появляется как будто вы вообще не хотите менять код! –

+0

@Amin Jafari Есть сотни способов сделать что-то, я только указал два, которые мне не нужны. Все еще было 98 других, чтобы выбрать из;) –

ответ

3

Установить контекст, используя метод .bind() ЯШ:

Parent.beHappy = this.study.bind(this); 

Или поддерживать даже старые браузеры, использовать JQuery $ .proxy():

Parent.beHappy = $.proxy(this.study, this); 

var Parent = { }; 
 

 
var Child = { 
 
    born : function() { 
 
     Parent.beHappy = $.proxy(this.study, this); 
 
    }, 
 

 
    study : function() { 
 
     snippet.log("Studying!"); 
 
     console.log("Studying!"); 
 
     console.log("Now I'm going to play"); 
 
     snippet.log("Now I'm going to play"); 
 
     this.play(); 
 
    }, 
 

 
    play : function() { 
 
     console.log("Playing!"); 
 
     snippet.log("Playing!"); 
 
    } 
 
} 
 

 
Child.born(); 
 
Parent.beHappy();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+2

'snippet.log();'! Когда это произошло..! Еще один [запрос функции] (http://meta.stackoverflow.com/a/271776/2333214), чтобы ударить .. –

+2

@TJ http://meta.stackexchange.com/questions/239706/add-a-console -to-stack-snippets/242144 # 242144 Thx to TJ Crowder –

Смежные вопросы