2013-12-12 49 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

这不是真正的原型,但它只是循环和附加一个方法。不幸的是,我试图通过利用原型来避免这种情况。 –