Сохранить этот указатель в JavaScript, используя прототип - PullRequest
0 голосов
/ 12 июня 2011

У меня возникли проблемы с использованием прототипов observe и получением доступа к этому указателю.Примите во внимание следующее:

var Demo = Class.create({
    this.someValue = "this is the value",

    initialize: function() {
        Event.observe("button1", "click", function() {
            alert(this.someValue);
        });

        Event.observe("button2", "click", this.testFunc());
    },

    testFunc: function() {
        alert(this.someValue);
    }
});

Нажатие на оба элемента управления button1 и button2 не выполняет то, что я хотел бы, а именно отображение предупреждения «это значение», но вместо этого отображаетсяисточник события (т.е. кнопка).Поэтому мой вопрос заключается в том, как я могу достичь того, чего я добиваюсь, и чтобы указатель this был равен Demo классу.

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Из руководства :

Прототип связывает функцию спасения.Используя bind (), вы можете убедиться, что ваш метод получает права this.

В вашем примере:

var Demo = Class.create({

    initialize: function() {
        this.someValue = "this is the value";

        Event.observe("button1", "click", (function() {
            alert(this.someValue);
        }).bind(this));

        Event.observe("button2", "click", this.testFunc.bind(this));
    },

    testFunc: function() {
        alert(this.someValue);
    }
});
2 голосов
/ 12 июня 2011

В области, где this относится к нужному объекту, присвойте его переменной (например, self), а затем обратитесь к переменной в областях, в которых this больше не относится к нужному объекту.Пример:

 /**
  * @constructor
  */
 var Demo = function(){};

 /**
  * Some value
  * @type {string}
  */
 Demo.prototype.someValue = "this is the value";

 /**
  * Initializes the demo.
  */
  Demo.prototype.initialize = function() {
     var self = this;
     Event.observe("button1", "click", function() {
        alert(self.someValue);
     });
     Event.observe("button2", "click", self.testFunc());
  };

  /**
   * Prints the value
   */
  Demo.prototype.testFunc = function() {
     alert(this.someValue);
  };
...