2016-08-26 2 views
-2

У меня есть следующий код

$(document).ready(function($) { 
    "use strict"; 
    generalClass = function() { 

    this.ip    = false; // page page 
    this.ie    = false; // IE 
    this.pp    = false; // portfolio page 
    this.om    = false; // organize menu 
    this.wc    = false; // shop 
    this.sh    = false; // side header 

    // So we can get the correct $this if needed 
    $this    = this; 

    this.__init(); 

} 

generalClass.prototype = { 

    __init: function($check) { 

    // Run functions 
    $this.__format(); 
    $this.__resize(); 
    } 
} 
}); 

Но я получаю, что $this не определено. Я попытался написать его как var $ this, но все же он не определен для $this.__format();. Я понимаю, что я могу использовать это вместо $this, но есть примеры позже в коде, где я не могу. Как сделать так, чтобы $this был определен в функции __init()? Так что это относится к generalClass.

Спасибо!

+0

Что вы пытаетесь сделать в первую очередь? – Hackerman

+0

Возможный дубликат [javascript - доступ к переменным частного члена из определенных прототипов функций] (http://stackoverflow.com/questions/436120/javascript-accessing-private-member-variables-from-prototype-defined-functions) – JJJ

+0

Проверить этот ответ связан с ** режимом «использовать строгий» **: [Что делает «использовать строгий» в JavaScript, и каковы причины этого?] (http://stackoverflow.com/a/11496488/2247494) – jherax

ответ

3

Прежде всего, если вы хотите использовать строгий режим, то вы должны поставить var (или let или const) перед вашим generalClass и $this.

Как что:

(function() { 
    "use strict"; 
    var generalClass = function() { 

     this.ip    = false; // page page 
     this.ie    = false; // IE 
     this.pp    = false; // portfolio page 
     this.om    = false; // organize menu 
     this.wc    = false; // shop 
     this.sh    = false; // side header 

     // So we can get the correct $this if needed 
     var $this    = this; 

     this.__init(); 
    }; 

    generalClass.prototype = { 

     __init: function($check) { 
      console.log('$this', $this); 
      // Run functions 
      $this.__format(); 
      $this.__resize(); 
     } 
    } 

    var instance = new generalClass(); 
}()); 

(я изменил $(document).ready() к IIFE, так что я мог запустить его в консоли Plus, я создал экземпляр вашего класса.).

Что происходит сейчас? $this внутри __init() не определен. Вам нужно будет определить $this внутри __init(), но вот в чем проблема: что ему нужно назначить?

В вашем примере __init() вы действительно можете позвонить this вместо $this, но, как вы уже указали, это не всегда возможно.

Но позвольте мне проиллюстрировать это с более абстрактным примером:

(function() { 
    var GeneralClass = function() { 
     this.foo = [1, 2, 3]; 
     this.bar = 4; 
     this.baz = [5]; 
    }; 

    GeneralClass.prototype.someFunction = function() { 
     console.log('foo', this.foo); // [1, 2, 3] 
     console.log('bar', this.bar); 

     var self = this; // storing reference to *this* (oobject for later) 

     this.baz.forEach(function (item) { 
      console.log('baz?', this.baz); // undefined, because *this* means here this.baz, and there is no this.baz.baz 
      console.log('baz!', self.baz); // [5] 
     }); 

     console.log('foo * bar'); 
     this.foo.forEach(function (item, index) { 
      console.log('item', index, 'value', item * self.bar); 
     }); 

     console.log('Both accesible here', this.bar, self.bar); 
    }; 

    var generalClassInstance = new GeneralClass(); 
    generalClassInstance.someFunction(); 
}()); 

Здесь я задаю this к self (лично я бы использовал $this для $(this), но это только условность так делать, как вам угодно, до тех пор, поскольку вы последовательны). Теперь функции, называемые внутри моей функции, могут использовать self, который работает как ссылка на внешний this. И если бы я назвал другую функцию в моей подфункции, она все равно указывала бы GeneralClassthis.

Надеюсь, вас заинтересовали в первую очередь.

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