0

我正在創建一個基於GAS Spreadsheets Service的應用程序,它可以讀取/寫入&更新一行數據。我有一個代表一行數據的鍵值對象,就像片段中提供的示例數據一樣。嵌套函數作爲數據原型的對象字面值對象

使用案例:

var exampleData = [{weekendVolume=5186270,midweekVolume=16405609}]; 
// tuple length 2 of two known values 

function _DataRecordObject(exampleData) { 
    this._endOfWeek = new Date().endOfWeek();// Date.prototype method 
} 

var _DataRecordMethods = { 

    weekEnding: function() { 
     return this._endOfWeek.formatDateString() 
    }, 
    weekMonth: function() { 
     return this._endOfWeek.getMonthLabelShort() 
    }, 
    /* Processed volume */ 
    weekendVolume: function() { 
     return 'weekendVolume' 
    }, 
    midweekVolume: function() { 
     return 'midweekVolume' 
    }, 
    totalVolumeProcessed: function() { 
     return _SumTotal( 
     this.weekendVolume(), 
     this.midweekVolume() 
     ) 
    } 
    } 

_DataRecordObject.prototype = _DataRecordMethods; 

new DataRecordObject是一個表對象,它提供其他有用的性質的原型。 _SumTotal是一個輔助函數。

我的問題:

當我打電話與片範圍作爲參數新DataRecordObject,如何更新與新的特性,例如totalVolumeProcessed的exampleData對象?

例如:

var foo = new _DataRecordObject(exampleData); 
Console.log(foo); 
//[{weekEnding='Aug-17',weekMonth=4,weekendVolume=5186270,midweekVolume=16405609,totalVolumeProcessed=21591879}] 

我想使用構造原型繼承,但使用類似對象的文字一個樣板式的模板的靈活性。我的直覺表明,我需要在構建新的dataRecordObject時傳遞數據對象鍵。

我是JavaScript的新手,尚未掌握繼承,原型和各自的設計模式。工廠和模塊,或者觀察員似乎是合適的模式,但我對JS的有限經驗是解決我的問題的限制因素。

+0

'totalVolumeProcessed'不需要更新,這是一種方法。 – Bergi

+0

是的,您可能應該將'exampledata'參數值存儲在對象的屬性中,就像您使用'this._endOfWeek = ...'所做的一樣。 – Bergi

+0

嘿@Bergi感謝您的反饋。因爲我認爲我的語言具有誤導性,所以我重新提出了我的問題。基本上我想使用'_DataRecordMethods'原型提供的方法更新'exampleData'對象。 –

回答

0

這可能適合你。

1)定義原型作爲對象常量:

var methods = { 

    sayName: function() { 
    return "My name is " + this.name; 
    }, 

    sayAge: function() { 
    return "I am " + this.age + " years old"; 

    } 


}; 

2),則可以使「方法的」可變全局或定義了下列功能的內部。該函數使用'methods'變量作爲原型創建一個新對象,並使用'data'參數中的值填充它。

function createNewObj (data) { 

    var data = data || null; 

    var result = Object.create(methods); 

    for (var key in data) { 

    if (data.hasOwnProperty(key)) { 

     result[key] = data[key]; 

    } 

    } 

    return result; 

} 

3)使事情我一起

function test() { 

    var data = {name: "John", age: "32"}; 

    var row = createNewObj(data); 

    Logger.log(row.name); //logs 'John' 
    Logger.log(row.age); //logs '32' 
    Logger.log(row.sayName()); //logs 'My name is John' 
    Logger.log(row.sayAge()); //logs 'I am 32 years old' 
    Logger.log(Object.getPrototypeOf(row)); // returns contents of the 'methods' object literal 
    Logger.log(row.hasOwnProperty("sayName")); //logs 'false' because 'hasOwnProperty' doesn't go up the prototype chain 
    Logger.log("sayName" in row); //logs 'true' because 'in' goes up the chain 

} 

建議你看一看由耶胡達·卡茨這個博客貼子,將深入到原型http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/它有可能會有所幫助的更清潔的代碼示例。

+0

感謝回覆@ Anton-Dementiev,這有點解決問題,但是函數返回的是方法而不是值。例如,傳遞示例數據,'[{weekendVolume = 5186270,midweekVolume = 16405609}]'然後'Logger.log(foo.totalVolumeProcessed()); // null'或'Logger.log(foo.totalVolumeProcessed); // function(){ return _SumTotal(this.weekendVolume,this.midweekVolume).sum; }' –

+0

和Yehudi Katz的鏈接很有幫助 - 我認爲解決方案可能類似於_Native Object Orientation _...部分。 –

0

我找到了解決方案,它擴展了@ Anton-Dementiev的迴應。他建議閱讀耶胡迪卡茨也是最有幫助的。

的創造新的目標函數,_DataRecordObject就是解決之道在於..

function _DataRecordObject(RowDataObject) { 
    this._endOfWeek = new Date().endOfWeek();// Date.prototype method 

    var data = RowDataObject || null; 
    var result = Object.create(_DataRecordMethods); 

    for (var key in data) { 
    if (data.hasOwnProperty(key)) { 
    // if value is present in the RowDataObject, 
    // then assign its value to the result 
     result[key] = data[key]; 
    } else { 
    // if not, the value is a method function, 
    // which should be evaluated in that context, 
    // and then return the method value as result 
     var foo = Object.getPrototypeOf(result)[ key ]; 
     result[key] = foo.call(data); 
    } 
    } 
    return result; 
} 
//simples 

由於方法的屬性函數傳遞,他們需要被稱爲在這方面的功能。