我正在创建一个基于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
是Sheet对象的原型,提供其他有用的属性。 _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 :(得分:0)
这可能适合你。
1)将原型定义为对象文字:
var methods = {
sayName: function() {
return "My name is " + this.name;
},
sayAge: function() {
return "I am " + this.age + " years old";
}
};
2)您可以将'methods'变量设为全局变量,也可以在以下函数中定义它。该函数使用'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
}
我建议你看看Yehuda Katz撰写的这篇博文,深入了解原型http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/它有一些更清晰的代码可能有用。
答案 1 :(得分:0)
我找到了一个解决方案,扩展了@ Anton-Dementiev的回应。他建议阅读Yehudi Katz也是最有帮助的。
创建新对象函数import { MyComponent, MyOtherComponent } from 'my-library';
是解决方案的所在..
_DataRecordObject
由于方法作为属性函数传递,因此需要在该上下文中将它们作为函数调用。