我正在寻找将方法原型化到从数据库接收的记录上。将原型添加到JSON字符串中的所有对象
我发现this answer已经存在,但它要求您为每个已有对象实例化一个新对象。这似乎很多工作,但可能是唯一的方法。
有没有一种方法将方法原型化到JSON字符串中的所有对象上,而不涉及为每条记录实例化一个新对象?
我正在寻找将方法原型化到从数据库接收的记录上。将原型添加到JSON字符串中的所有对象
我发现this answer已经存在,但它要求您为每个已有对象实例化一个新对象。这似乎很多工作,但可能是唯一的方法。
有没有一种方法将方法原型化到JSON字符串中的所有对象上,而不涉及为每条记录实例化一个新对象?
正如我所说的评论,你可以为你保留键记住使用一个简单的齐磊功能的JSON解析中,只要。看到这个jsFiddle:http://jsfiddle.net/38Ytc/3/ 这是一个例子,假设您在某处(例如,从文本框中)获取了JSON字符串,并且需要将某些函数添加到由此数据返回的对象中。然后我们调用parse
作为第二个参数的reviver函数,这将在数据结构中调用每个键。对于我们最简单的例子,它会将除顶层对象(键“”)以外的所有非数组对象转换为DataRow对象,该对象具有方法get
,set
和save
。
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
在这种情况下,你甚至不需要调用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();
这不是真正的原型,但它只是循环和附加一个方法。不幸的是,我试图通过利用原型来避免这种情况。 –
考虑使用齐磊自动生成包装对象: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse – Kroltan