2016-07-18 42 views
2

最近我嘗試使用JavaScript OOP與jQuery, 我寫了這個代碼:的JavaScript - this.update不是一個函數

var beer = function(){}; 

$.extend(ntf.prototype, { 
    types:{ 
     '.test':'test', 
    }, 

    init:function() { 
     $.each(this.types, function(key, value) { 
      this.update(key, value); 
     }); 
    }, 
    update:function(className, actionName) { 
     $(className + ' .event').click(function() { 
      $(this).parent().find('.pevent').load('navigate.php?do=create&action=' + actionName); 
      alert("TEST"); 
     }).click(); 
    }, 
    pics:{ 
     add:function(element) { 
      $.post("navigate.php?do=nav&action=pics", { 
       name:$(element).data('name'), 
      }); 
     } 
    } 
}); 
beer.prototype.init(); 

但是,在控制檯它返回該錯誤:Uncaught TypeError: this.update is not a function

如何以更好的方式在jQuery中使用JavaScript OOP,以及如何解決此問題?

回答

3

這是範圍問題。請注意,「this」在「each」函數調用之前和呼叫中不同。

您可以通過將範圍分配給本地變量來使用該範圍,即本例中的「我」。

init:function() { 
    var me = this; 
     $.each(this.types, function(key, value) { 
      me.update(key, value); 
     }); 
    }, 

如果你想看到的是什麼範圍的差別,只要登錄兩者並在控制檯檢查。

這裏首先「this」是全局作用域,而第二個(在匿名方法內)是本地作用域。

init:function() { 
     console.log(this); 
     $.each(this.types, function(key, value) { 
      console.log(this); 
     }); 
    }, 

您可以參考本作更多的澄清這一範圍:http://javascriptplayground.com/blog/2012/04/javascript-variable-scope-this/

+0

風扇謝謝!而且,在JavaScript OOP中使用jQuery有更好的方法嗎? –

+0

我無法預測您使用此類比的方式中的任何問題。繼續,你會學習更多,當你使用它。 – Ash

+0

如果它適合您,請將其標記爲答案,以便其他人可以找到它。 – Ash

2

除了什麼@Ash說,我的bind

init:function() { 
    $.each(this.types, function(key, value) { 
    this.update(key, value); 
    }.bind(this); 
},