2011-09-26 131 views
0

我一直在這個小時,只是不能得到它很正確。我有一個工作正常的方法的對象。我需要使用JSON.stringify將其另存爲字符串,然後將其作爲對象返回並仍然使用相同的方法。Javascript應用方法從一個對象到另一個對象

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

可能的複製定義的那些方法,以擴展現有的對象//stackoverflow.com/q/6754919/902654 – someone

回答

1

您需要的方法複製到新的對象:

newWorkflow.getTitle = workflow.getTitle; 
+0

好的,但有很多方法。我可以做一個循環newWorkflow [方法] =工作流[方法];這是一個選擇嗎? –

0

你正在失去你的功能,當你字符串化和解析。 如果你有機會到jQuery的,在$ .extend是很方便的(如果不是,只是複製粘貼&形式的jQuery源)

這裏有一個演示: http://jsfiddle.net/VPfLc/

+0

我希望我有權訪問jquery,但這是Google Apps腳本,它不允許使用它,我必須將該對象保存到電子表格中的單元格。 –

+0

只是從jquery源碼複製粘貼,其功能不是很大 – karnyj

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 
} 
+0

不幸的是你沒有jQuery。extend()在初始化函數中爲你的對象自動添加屬性,但你至少可以手動添加它們,並保留大部分開始使用的代碼流。 – funwhilelost

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將爲空,它將被設置爲一個新的數組。在已有該屬性的現有對象上調用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;}; 
} 

然後使用:HTTP:

WorkflowMethodExtensions.call(newWorkflow); 

與所述existion

+0

這就是我來這裏的原因。你們是天才! –

+0

Sooo關閉但我在JSON字符串中的一個變量是一個數組,它在使用調用後奇怪地丟失了內容。 –

+0

你是否在初始化函數中將數組設置爲'[]'? –

相關問題