2012-01-15 40 views
4

所以我有一個功能,它看起來像這樣:的JavaScript混淆目標函數「沒有方法」錯誤

function Students(){ 
    // Function add: 
    // Returns: add page 
    this.add = function(){ 

    // Get template 
    $.get('view/students/new.html', function(template){ 

    // Templating 
    var html = Mustache.to_html(template); 

    // When document ready, write template to page 
    $('document').ready(function(){ 
     $('#container').html(html); 
    }); 
    }); 
}; 

}; 

當我嘗試調用它的add功能,像這樣:
Students.add();

我得到錯誤: Uncaught TypeError: Object function Students(){...}has no method 'add'

是怎麼回事?

回答

13

要使用的Students該實現,你應該這樣做:

var students = new Students(); 
students.add(); 

然而,這可能不是你想要的。你可能意味着定義Students這樣的:

var Students = { 
    add: function() { 
     $.get(/* ... */); 
    } 
}; 

然後,你可以這樣調用:

Students.add(); 
+1

完美。謝謝。 – danwoods 2012-01-15 23:45:23

2

你不加入「添加」功能的「學生」函數的代碼;您將其添加到使用「學生」作爲構造函數創建的實例

var student = new Students(); 

student.add(); // won't get the error 
3

學生打算被稱爲一個構造

var s = new Students(); 
s.add() 

裏面的Studentsthis將是一個新的對象,從學生的prorotype繼承,並自動返回。所以說

this.add = function() .... 

add函數添加到該對象正在返回。但是,該函數將從頭每一次調用此功能來製作。爲什麼不將它添加到樣機代替,所以該函數將只存在一次,而不必受到不必要的每一次重新創建。

Students.prototype.add = function(){ 
1

好,Students不具有add方法。

我想你假設你知道如何this作品。它不是對函數的引用,除非手動完成。的this的價值將完全取決於你如何調用Students