JQuery ломая «это» в конструкторе? - PullRequest
1 голос
/ 07 мая 2011

Я работаю с jQuery и создаю некоторые функциональные возможности OOP Javascript.Объект и его конструктор имеют следующую структуру:

var zoomin = new Object();
zoomin = function() { // This is my constructor
    this.someFunction();
};

zoomin.prototype = {
    someFunction: function() {
        // More code here
    }
};

Когда я создаю экземпляр zoomin (например, var my_zoom = new zoomin ();), вызов this.someFunction () в конструкторе делаетне работа.Кажется, что jQuery овладевает «этим», и именно поэтому оно ломается.

Я был бы очень признателен за любую помощь в том, как заставить это работать правильно.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

Ваше определение класса должно быть таким:

function zoomin() {    // This is my constructor
   this.someFunction();
};

Для определения метода-члена это должно быть:

zoomin.prototype.someFunction = function() {
     // More code here
};

или

$.extend(zoomin.prototype, {
   someFunction : function() {
      // More code here
   }
});

Надеюсь, это поможет. Приветствия

1 голос
/ 07 мая 2011

См. Другие ответы, как более чистые способы организовать это. В этом ответе просто делается попытка обратиться к понятию "jQuerying разбиения this в конструкторе".

Функциональный объект (например, zoomin) должен быть вызван с помощью new, чтобы действовать как конструктор (конструкторы - просто функции, без * 1011 нет ничего особенного *). То есть, если zoomin используется в качестве функции обратного вызова в jQuery, тогда this будет конкретным (но произвольным) объектом, который, вероятно, не является новым экземпляром объекта. Это может создать иллюзию, что jQuery ломает конструктор; однако это не так, потому что конструктор не был вызван с new и, таким образом, действует как «нормальная функция».

Если используется new fnObject, то this (внутри функции fnOjbect) будет всегда быть новым экземпляром "fnObject". Существует никак для jQuery, чтобы изменить это, даже если он действительно очень старался.

Кроме того, zoomin = new Object бесполезен на 100%, потому что следующая строка просто присваивает новое значение (объект-функция конструктора) zoomin: -)

Счастливого кодирования.

1 голос
/ 07 мая 2011

ваш код довольно испорчен. вы создаете новый объект, затем назначаете функцию той же переменной. поэтому первое утверждение не является необходимым (и не является хорошей практикой), затем присваивает объект (с некоторыми свойствами) прототипу объекта zoomin вместо добавления свойства (someFunction) к нему.

попытайтесь определить ваш конструктор так:

function zoomin(){
// this is your constructor
}
zoomin.prototype.someFunction = function(){
// this is your method.
}

var zm = new zoomin();
zm.someFunction();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...