【问题标题】:Javascript apply methods from one object to anotherJavascript 将方法从一个对象应用到另一个对象
【发布时间】:2011-09-26 23:38:03
【问题描述】:

我已经在这工作了好几个小时,但还是不能完全正确。我有一个对象,其方法可以正常工作。我需要使用 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
}

我认为我应该为新对象制作原型,但似乎没有任何效果。 请帮助我的头发很少。

【问题讨论】:

标签: javascript


【解决方案1】:

您需要将方法复制到新对象:

newWorkflow.getTitle = workflow.getTitle;

【讨论】:

  • 好的,但是有很多方法。我可以做一个循环 newWorkflow[method] = workflow[method];这是一个选择吗?
【解决方案2】:

当您进行字符串化和解析时,您正在丢失您的功能。 如果您可以访问 jquery,则 $.extend 很方便(如果没有,只需复制和粘贴表单 jquery 源)

这是一个演示: http://jsfiddle.net/VPfLc/

【讨论】:

  • 我真希望我可以访问 jquery,但这是不允许访问的 Google Apps 脚本,我必须将对象保存到电子表格中的单元格中。
  • 只是从jquery源复制粘贴,功能不大
【解决方案3】:

序列化为 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
}

【讨论】:

  • 不幸的是,您没有 jQuery.extend() 在初始化函数中自动将属性添加到您的对象,但您至少可以在此处手动添加它们并保留您开始的大部分相同代码流与。
【解决方案4】:

您所要做的就是使用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 将为空,并将设置为新数组。对已经具有该属性的现有对象调用 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);

使用现有对象中定义的方法扩展现有对象

【讨论】:

  • 这就是我来这里的原因。你们是天才!
  • 太接近了,但我在 JSON 字符串中的一个变量是一个数组,它的内容在我使用 call 后奇怪地丢失了。
  • 你在初始化函数中将数组设置为'[]'吗?
猜你喜欢
  • 2012-10-04
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多