我已经在这里工作了好几个小时,但却无法做到这一点。我有一个对象的方法工作正常。我需要使用JSON.stringify将其保存为字符串,然后将其作为对象返回并仍然使用相同的方法。
function Workflow(){
this.setTitle = function(newtitle){this.title = newtitle; return this;};
this.getTitle = function(){return this.title;};
}
function testIn(){
var workflow = new Workflow().setTitle('Workflow Test');
Logger.log(workflow);//{title=Workflow Test}
Logger.log(workflow.getTitle()); //Workflow Test
var stringy = JSON.stringify(workflow);
var newWorkflow = Utilities.jsonParse(stringy);
Logger.log(newWorkflow); //{title=Workflow Test}
//Looks like the same properties as above
Logger.log(newWorkflow.getTitle());//Error can't find getTitle
}
我认为我应该对新对象进行原型设计,但似乎没有任何效果。 请帮助我留下很少的头发。
答案 0 :(得分:1)
您需要将方法复制到新对象:
newWorkflow.getTitle = workflow.getTitle;
答案 1 :(得分:0)
当你进行字符串化和解析时,你正在失去你的功能。 如果你有权访问jquery,$ .extend很方便(如果没有,只需复制和粘贴表单jquery源)
这是一个演示: http://jsfiddle.net/VPfLc/
答案 2 :(得分:0)
序列化为JSON不会存储可执行代码。在调用JSON.stringify时,它将从您的对象中删除。您最好的选择是创建对象,以便在创建时对其进行初始化。
function Workflow(){
this.initialize = function(properties) { this.title = properties.title; }
this.setTitle = function(newtitle){this.title = newtitle; return this;};
this.getTitle = function(){return this.title;};
}
function testIn(){
var workflow = new Workflow().setTitle('Workflow Test');
Logger.log(workflow);//{title=Workflow Test}
Logger.log(workflow.getTitle()); //Workflow Test
var stringy = JSON.stringify(workflow);
var newWorkflow = new Workflow().initialize(Utilities.jsonParse(stringy));
Logger.log(newWorkflow); //{title=Workflow Test}
//Looks like the same properties as above
Logger.log(newWorkflow.getTitle());//Error can't find getTitle
}
答案 3 :(得分:0)
您所要做的就是使用call
。
Workflow.call(newWorkflow);
修改强>
如果您的实际Workflow()
实现在启动期间将任何属性设置为默认值,则调用新的json对象也将重置这些属性。这是我假设正在进行的,而无法查看您的实际实现代码。
如果是这种情况,那么您有两种选择。
1)不是盲目地启动你的对象(并假设它是空的),而是有条件地启动你的变量。
function Workflow(){
this.setTitle = function(newtitle){this.title = newtitle; return this;};
this.getTitle = function(){return this.title;};
this.array = this.array || [];
}
用于新的空对象。 this.array
将为null,并且它将被设置为新数组。
Workflow
,它将不管它。
2)将您的方法提取到扩展模块
function Workflow(){
this.array = this.array || [];
// Other work
// Lastly include my method extensions.
WorkflowMethodExtensions.call(this);
}
function WorkflowMethodExtensions(){
this.setTitle = function(newtitle){this.title = newtitle; return this;};
this.getTitle = function(){return this.title;};
}
然后使用:
WorkflowMethodExtensions.call(newWorkflow);
使用existion
中定义的那些方法扩展现有对象