2013-12-12 89 views
1

我正在尋找將方法原型化到從數據庫接收的記錄上。將原型添加到JSON字符串中的所有對象

我發現this answer已經存在,但它要求您爲每個已有對象實例化一個新對象。這似乎很多工作,但可能是唯一的方法。

有沒有一種方法將方法原型化到JSON字符串中的所有對象上,而不涉及爲每條記錄實例化一個新對象?

+0

考慮使用齊磊自動生成包裝對象: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse – Kroltan

回答

2

正如我所說的評論,你可以爲你保留鍵記住使用一個簡單的齊磊功能的JSON解析中,只要。看到這個jsFiddle:http://jsfiddle.net/38Ytc/3/ 這是一個例子,假設您在某處(例如,從文本框中)獲取了JSON字符串,並且需要將某些函數添加到由此數據返回的對象中。然後我們調用parse作爲第二個參數的reviver函數,這將在數據結構中調用每個鍵。對於我們最簡單的例子,它會將除頂層對象(鍵「」)以外的所有非數組對象轉換爲DataRow對象,該對象具有方法getsetsave

var inputEl = $("#exampleInput"); 
var outputEl = $("#exampleOutput"); 

function DataRow(contents) { 
    this.object = contents; 
} 
DataRow.prototype.get = function(key) {return key?this.object[key].object:this.object;}; 
DataRow.prototype.set = function(key, val) {if (key) {this.object[key] = val;} else {this.object = val;};}; 
DataRow.prototype.save = function() {/*Save to DB or whatever*/}; 

inputEl.change(function() { 
    var resultObject = JSON.parse(inputEl.val(),function(key, val) { 
     if (key === "" || typeof val === Array) { //See MDN for why this is necessary 
      return val; 
     } else { 
      return new DataRow(val); 
     } 
    }); 
    console.log(resultObject.entries.object[0].get("title")); 
    outputEl.val(JSON.stringify(resultObject)); 
}); 

此處理後,你可以簡單地使用resultObject.entries.object[0].get("title")獲得對象的標題,如果存在的話。

參考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

0

在這種情況下,你甚至不需要調用bind(),除非你想通過'this'關鍵字訪問對象的屬性。如果您不需要的對象訪問,你可以簡單地這樣做:

var records = [{'val':1},{'val':2}]; 

records.forEach(function(record){ 
    record.someMethod = function(){ 
     console.log('Some action'); 
    } 
}); 

records[1].someMethod(); 
records[0].someMethod(); 
+1

這不是真正的原型,但它只是循環和附加一個方法。不幸的是,我試圖通過利用原型來避免這種情況。 –