Javascript将方法从一个对象应用到另一个对象

时间:2011-09-26 23:38:03

标签: javascript

我已经在这里工作了好几个小时,但却无法做到这一点。我有一个对象的方法工作正常。我需要使用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
}

我认为我应该对新对象进行原型设计,但似乎没有任何效果。 请帮助我留下很少的头发。

4 个答案:

答案 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

中定义的那些方法扩展现有对象