Javascript 这是一种合理的类继承方法吗?

Javascript 这是一种合理的类继承方法吗?,javascript,object,inheritance,google-apps-script,google-sheets,Javascript,Object,Inheritance,Google Apps Script,Google Sheets,为了进一步了解Javascript(GoogleApps脚本风格),我创建了一个对象结构,我认为它可能对许多项目有用。我这次演示的主要目标是: 学习使用对象(类)和继承 通过在每张工作表中调用一次数据表,尽量减少对电子表格服务的调用 使用电子表格上的命名范围访问表中的数据 下面的代码似乎很成功,但肯定可以改进。以下是几个主要问题: 有没有比这更好的方法来完成方法和属性的继承 为每个图纸对象运行Spreadsheet()函数,从而使环境结构在每个图纸对象中具有单独的“ss”和“namedRa

为了进一步了解Javascript(GoogleApps脚本风格),我创建了一个对象结构,我认为它可能对许多项目有用。我这次演示的主要目标是:

  • 学习使用对象(类)和继承
  • 通过在每张工作表中调用一次数据表,尽量减少对电子表格服务的调用
  • 使用电子表格上的命名范围访问表中的数据
下面的代码似乎很成功,但肯定可以改进。以下是几个主要问题:

  • 有没有比这更好的方法来完成方法和属性的继承
  • 为每个图纸对象运行Spreadsheet()函数,从而使环境结构在每个图纸对象中具有单独的“ss”和“namedRangeList”属性。这是正常的和预期的吗?还是有更好的方法来避免这种重复?或者,Javascript只是记录指向这些对象的单个实例的指针,所以它们看起来是否重复并不重要?
    • 因为它们对所有的工作表都是通用的,并且对所有的工作表都是相同的,所以我希望“ss”和“namedRangeList”只在环境级别显示,因此通过继承而不是复制对工作表可用
  • 还有什么其他的改变或方法可以提高我对类和对象的初步使用和理解
下面是我的代码的精简版本,它保留了结构的本质,但省略了注释、错误处理和其他功能。感谢您的评论和帮助

function Environment() {
  this.title = 'Car & Driver';
  this.ui = SpreadsheetApp.getUi();
  this.dd = new Drivers();
  this.cc = new Cars();
}

function Spreadsheet() {
  this.ss = SpreadsheetApp.getActiveSpreadsheet();

  this.namedRangeList = {};
  var namedRanges = this.ss.getNamedRanges();
  for (var i = 0; i < namedRanges.length; i++) {
    var range = namedRanges[i].getRange();
    this.namedRangeList[namedRanges[i].getName()] = {
      sheet: range.getSheet().getSheetName(),
      row: range.getRow(),
      column: range.getColumn(),
      rowCount: range.getNumRows(),
      columnCount: range.getNumColumns(),
    }
  }
}
Spreadsheet.prototype = Object.create(Environment.prototype);

function Sheet() {
  Spreadsheet.call(this);
  this.sheet = this.ss.getSheetByName(this.sheetName);
  this.data = this.sheet.getDataRange().getValues();
}
Sheet.prototype = Object.create(Spreadsheet.prototype);

function Cars() {
  this.sheetName = 'Cars';
  this.abbreviation = 'cc';
  Sheet.call(this);
}
Cars.prototype = Object.create(Sheet.prototype);

function Drivers() {
  this.sheetName = 'Drivers';
  this.abbreviation = 'dd';
  Sheet.call(this);
}
Drivers.prototype = Object.create(Sheet.prototype);

Sheet.prototype.idxOf = function(namedRange) {
  return (this.namedRangeList[namedRange].rowCount == 1) ?
    this.namedRangeList[namedRange].row - 1 :
    this.namedRangeList[namedRange].column - 1;
}

function test_Environment() {
  var env = new Environment();

  env.ui.alert('The third driver is ' +
      env.dd.data[3][env.dd.idxOf('ddFirst')] + ' ' + env.dd.data[3][env.dd.idxOf('ddLast')] + '.');

  var tests = [
    ['dd', 2, 'ddLast'    , 'Bailey'  ],
    ['dd', 3, 'ddLicense' , 'pro'     ],
    ['cc', 1, 'ccRadio'   , 122.5     ],
    ['cc', 4, 'ccModel'   , 'Corvette'],
  ];
  tests.forEach(function(t) {
    var v = env[t[0]].data[t[1]][env[t[0]].idxOf(t[2])];
    Logger.log( (v == t[3]) + ': ' + (t[0] == 'dd' ? 'Driver ' : 'Car ') + 
        t[1] + ' ' + t[2].slice(2) + ' is ' + v );
  });

  env.ui.alert(env.title + ' is all done');
}
函数环境(){
this.title=‘汽车和司机’;
this.ui=SpreadsheetApp.getUi();
this.dd=新驱动程序();
this.cc=新车();
}
函数电子表格(){
this.ss=SpreadsheetApp.getActiveSpreadsheet();
this.namedRangeList={};
var namedRanges=this.ss.getNamedRanges();
对于(变量i=0;i
您可以查看的mozilla页面

关于javascript中的继承问题,也有大量的讨论


同样如评论中所述,如果您希望有人批评您的代码,请查看

,了解您应该发布的代码审查问题。需要考虑的一点是:使用。虽然我同意这个问题在代码审查堆栈中更为重要,但应用程序中的脚本类尚未实现,因此在这种情况下不能使用它。@trincot谷歌应用程序脚本中还不支持这些类。一些用户可以使用v8访问测试版环境,但对于其他用户来说,这一切都是免费的rhino@op您可以在调试时验证类对象是否都具有
this.ss
this.namedRangeList
的不同实例。您肯定希望使用工厂方法,以便工厂为所有对象提供共享电子表格引用,并为同一图纸上的对象提供共享图纸引用。(你最终会想要在图纸之间正确移动对象的逻辑)谢谢大家给我指点。我已经把我的问题重新发布在那里了。谢谢你给我指出代码审查。我将在那里转发我的邮件。@DaveinOhio如果你在那里发布,请确保在发布之前阅读他们的邮件,以获得最大的成功。