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 

由于方法的属性函数传递,他们需要被称为在这方面的功能。