2014-12-28 3 views
0

Можно использовать переменную javascript this для myObject во всех вхождениях в следующем коде?JS - Как использовать `this` для обращения к одному и тому же объекту в разных областях?

jsFiddle - open console

function MyObject() { 
    this.myProperty = "a property"; 

    console.log("1 - this is %o (%s) in MyObject declaration", this, Object.prototype.toString.call(this)); 
    (function poll() { 
     console.log("2 - this is %o (%s) in poll function", this, Object.prototype.toString.call(this)); 
     setTimeout(function() { 
      console.log("3 - this is %o (%s) in setTimeout function", this, Object.prototype.toString.call(this)); 
      $.ajax({ 
       url: "/echo/json/", 
       dataType: "json", 
       success: function(data) { 
        console.log("4 - this is %o (%s) in ajax.success function. We have some data returned: %o", this, Object.prototype.toString.call(this), data); 
       }, 
       complete: poll 
      }); 
     }, 1000); 
    })(); 
}; 
$(document).ready(function() { 
    var myObject = new MyObject(); 
}); 

ответ

2

Да, это возможно. Как правило, вы должны использовать Function#bind, который возвращает новую функцию, которая при вызове вызовет оригинал с определенным значением для this. Function#bind - это функция ES5, присутствующая во всех современных браузерах; для поддержки старых браузеров, он может быть заполнен.

Вот пример:

function Foo(name) { 
 
    this.name = name; 
 
    setTimeout(function() { 
 
    snippet.log("this.name = " + this.name); 
 
    }.bind(this), 0); 
 
// ^^^^^^^^^^^---- Note 
 
} 
 

 
var f = new Foo("foo");
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

0

В этом случае, я думаю, что проще всего сделать, это просто копить ссылку на объект в переменной:

function MyObject() { 
    var theObject = this; 

    theObject.myProperty = "a property"; 

    // etc. 

переменная theObject может быть использована во всех других местах для ссылки на объект, который строится конструктором.

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