2015-04-07 52 views
0

我遇到了一個我從未見過的問題。通常當我建立JS「類」我只是做了簡單的對象樣式...Ajjax中的JS對象的塊函數

var page = { 
    add: function(k, v) { 
     this[k] = v; 
    } 
} 

我最近嘗試用var頁面做=函數(){等等等等} page.prototype = {風格,但現在當我試圖通過ajax發送東西時,一切都會中斷。我放入控制檯日誌來試圖看看發生了什麼,看起來在ajax調用中,對象正在變成窗口範圍,然後函數試圖進行參數化。可怕的解釋,我很抱歉,這裏是代碼,也許會更有意義......

var bioLocation = function(obj) { 
    this.ID = 0, 
    this.name = '', 
    this.address = ''; 
    if(typeof obj != 'undefined') { 
     return this.init(obj); 
    } 
} 
bioLocation.prototype = { 
    init: function(obj) { 
     for(var index in obj) { 
      this[index] = obj[index]; 
     } 
    } 
} 

顯然,我的真實對象的精簡版,但完美的表現。所以後來在代碼中,我有一個按鈕,即使它會通過ajax發送數據來保存一些類似的東西。

$('.save').click(function() { 
    var postData = {}; 
    var saveTest = new bioLocation({ID: $('.whatever').val()}); 
    postData.locations = saveTest; 
    var reply; 
    $.ajax({ 
     async: false, 
     type: "POST", 
     data: postData, 
     dataType: 'json', 
     success: function(msg) { 
      reply = msg; 
     } 
    }); 
}); 

此外,顯然是我的代碼的一個非常簡化的版本,但在目標上非常正確。 問題是我越來越奇怪的錯誤... 「無法讀取未定義的屬性undefined」這一行將直接指向bioLocations原型中init函數的第二行。

我在整個代碼中完成了大量的控制檯日誌,當我將它們放入init方法時,它會記錄兩次,一次在click函數中創建對象,一次在ajax調用中。下面是它的控制檯日誌代碼...

var bioLocation = function(obj) { 
    this.ID = 0, 
    this.name = '', 
    this.address = ''; 
    if(typeof obj != 'undefined') { 
     return this.init(obj); 
    } 
} 
bioLocation.prototype = { 
    init: function(obj) { 
     console.log(this); 
     for(var index in obj) { 
      this[index] = obj[index]; 
     } 
    } 
} 

所以我會得到2個控制檯日誌,當我點擊提交按鈕,第一個節目......

bioLocation {ID:5,名稱:「」,地址:「」}

然後它會記錄(仍然在相同的點擊事件),它會記錄第二次...

窗口{頂:窗口,窗口:窗口,位置:位置,外部:對象...}

然後我會得到那個錯誤「無法讀取屬性'undefined'未定義」

我不知道爲什麼它會記錄兩次,更重要的是,爲什麼第二個日誌是Window對象。這似乎是ajax調用嘗試序列化函數和獲取錯誤,但我從來沒有見過一個原型序列化時,對象被傳遞到ajax作爲參數。我可以確認它實際上是在嘗試param函數,因爲有更多的日誌記錄和頭髮拉動,我實際上能夠在網絡選項卡中看到ajax調用,並且它確實具有init:undefined作爲正在傳遞的參數之一到ajax頁面。

所以我想我的問題是,如何阻止jquery的ajax函數參數化對象的原型片時使用它作爲參數?而且,爲什麼它實際上將原型添加到了電話中?

請你必須幫助我,我在這裏放鬆我的心。我從來沒有見過這樣的事情。先謝謝你。

+0

嘗試'console.log(this,arguments)'' –

回答

0

構造函數需要返回新的對象,而不是返回值的init函數。省略return,默認返回this。你也有逗號,你應該有分號。按照慣例,類是大寫的。

var BioLocation = function (o) { 
    this.ID = 0; 
    this.name = ''; 
    this.address = ''; 
    if (typeof o !== 'undefined') { 
     this.init(o); 
    } 
} 
BioLocation.prototype = { 
    init: function (o) { 
     for (var i in o) { 
      this[i] = o[i]; 
     } 
    } 
}; 
var saveTest = new BioLocation({ ID: 5 }); 
console.log(saveTest);