具有嵌套函数的对象文字作为数据对象的原型

时间:2017-08-25 06:00:13

标签: javascript design-patterns google-apps-script prototype object-literal

我正在创建一个基于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的有限经验是解决我的问题的限制因素。

2 个答案:

答案 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

由于方法作为属性函数传递,因此需要在该上下文中将它们作为函数调用。