2015-09-15 57 views
0

我想創建一個ajax對象的原型。JQuery原型功能

我已經創建了以下功能:

$.extend({ 
    ajax_prototype : function(parammeters){ 
     instance = this; 
     instance.cache = false; 
     instance.crossDomain = false; 
     instance.dataType = 'json'; 
     instance.timeout = 30000; 
     instance.error = default_error_function; 

     $.each(parammeters,function(key,value){ 
      instance[key] = value; 
     }); 
    }, 
    set_ajax_action : function(template,action,func,def){ 
     template[action] = func;       
    } 
}); 

ajax_prototype
是對象的構造函數。
設置一些默認設置,並根據需要設置一些默認設置。

set_ajax_action
設置要在每個事件上執行的函數。

當我創建這樣一個對象:

temp1 = new $.ajax_prototype({ 
    'type'   : 'post', 
    'url'   : 'controller.php', 
}); 

我得到這個對象:

Object { cache: false, crossDomain: false, dataType: "json", timeout: 30000, error: default_error_function(), type: "post", url: "controller.php", success: function() } 

但之後我用這個:

$.set_ajax_action(temp1,'error',function(){console.log();}); 

的對象變成這樣:

Object { cache: false, crossDomain: false, dataType: "json", timeout: 30000, error: function(), type: "post", url: "controller.php", success: function() } 

基本上它們的區別在於設置錯誤功能的方式。這兩個對象工作良好。
但我想使原型創建第二種形式的對象。
有人可以解釋爲什麼兩個對象的差異以及如何解決我的問題?

編輯1
我還可以創建第二個對象,即使我從我的原型刪除錯誤屬性並調用$ .set_ajax_action(...)。
我的問題是爲什麼有不同的功能演示文稿控制檯。
我知道我的問題是微不足道的,無論哪種方式結果都是一樣的,但我想知道它是如何工作的。

順便說一句,即使我設置錯誤屬性是這樣的:

instance.error = function(){ ... }; 

結果將是:

Object { cache: false, ifModified: false, processData: true, crossDomain: false, dataType: "json", timeout: 30000, error: .ajax_prototype/instance.error(), url: "test" } 
+0

你爲什麼使用jQuery.extend?你沒有合併任何對象。 – Ozan

+0

@Ozan無明顯原因。我可以使用普通函數。結果是一樣的。 –

+0

找到你的錯誤函數的定義,像'function default_error_function(){...}',並用'var default_error_function = function(){...}'代替它。它會做你想要的嗎? –

回答

1

控制檯能夠跟蹤如果一個函數可以以某種方式識別。例如,如果它有一個名稱或者它被分配給變量,那麼控制檯將顯示其變量的名稱。如果它是在一個函數內部創建的,控制檯會顯示它。例如:

(function testt(){ 
    $.set_ajax_action(temp1,'error',function(){console.log();}); 
})() 
console.log(temp1) 

這個代碼將產生error: testt/<()(火狐)。

你可以隱藏函數的名字,而不是給你的默認處理程序一個名字。例如,像這樣:

(function(default_error_function){ 
    $.extend({ 
     ajax_prototype : function(parammeters){ 
      instance = this; 
      ... 
      instance.error=default_error_function 
      ... 
     }, 
     set_ajax_action : ... 
    }); 
})(function() {/* default error handler */}) 

這裏,default_error_function符號的範圍是不是全球性的,因此控制檯不會表現出來。同時,處理程序是在任何其他功能之外創建的,因此控制檯只有function()才能顯示。