Javascript 在哪个对象上调用.addToUI

Javascript 在哪个对象上调用.addToUI,javascript,google-apps-script,Javascript,Google Apps Script,我不熟悉javascript和google g-suite javascript编程;但有软件开发经验(如vb.net) 我试图理解以下函数定义,尤其是最后一个.addToUI()方法 我的理解是SpreadsheetApp.getUI()返回一个UI对象,在该对象上调用.createMenu()。我猜这会返回一个菜单对象(我想),然后在该对象上调用.addItem(),它可能还会返回一个菜单对象,那么初始UI对象如何接收.addToUI()方法呢 非常感谢您在这里解释方法链接是如何工作的 谢谢

我不熟悉javascript和google g-suite javascript编程;但有软件开发经验(如vb.net)

我试图理解以下函数定义,尤其是最后一个.addToUI()方法

我的理解是SpreadsheetApp.getUI()返回一个UI对象,在该对象上调用.createMenu()。我猜这会返回一个菜单对象(我想),然后在该对象上调用.addItem(),它可能还会返回一个菜单对象,那么初始UI对象如何接收.addToUI()方法呢

非常感谢您在这里解释方法链接是如何工作的

谢谢,

对象是根据它来自哪个实例的知识构造的,因此调用
菜单#addToUi()
不需要参数

至于链接
菜单
方法,如
添加项
添加分隔符
,它们有效地返回相同基础对象数据的句柄。也就是说,它们确实创建了一个新的对象句柄,因此它们之间的严格相等将返回
false
。 还有其他可链接的方法,它们确实会将句柄返回到不同的基础对象,例如您可能期望的那些方法,例如-句柄是新的基础对象,它是原始对象的深层副本,可以单独更新

所以要分解它,这个函数:

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("some menu name")
    .addItem('title','function called')
    .addSeparator()
    .addItem('title 2', 'function called')
    .addToUi();
}
在功能上等同于以下各项:

function onOpen() {
  // Create a reference to the single Ui class that is active for the user this is running for.
  var ui = SpreadsheetApp.getUi(); 
  // Create a new Menu object, which knows which Ui instance it came from
  var menu = ui.createMenu("some menu name");
  // Bind a new reference to that same object by assigning the return value of the class method
  var sameMenuAsAbove = menu.addItem('title', 'function called');
  // Because these are object instance methods that mutate the object, they don't have to be chained
  sameMenuAsAbove.addSeparator();
  sameMenuAsAbove.addItem('title 2', 'function called');

  // Because 'sameMenuAsAbove' and 'menu' are references to the same underlying menu object,
  // calling 'addToUi()' from EITHER will result in the same appearance.
  menu.addToUi();
}
可能会有帮助

如果您理解Python语法,菜单类可能如下所示:

class Menu():
  def __init__(self, ui, title):
    self.__ui = ui
    self.__title = title
    self.__drawn = []

  def addItem(self, caption, functionName):
    self.__drawn.append(Item(caption, functionName))
    return self

  def addSeparator(self):
    self.__drawn.append(Line())
    return self

  def addSubMenu(self, other_menu):
    self.__drawn.append(other_menu)
    return self

  def addToUi(self):
    self.__ui.add(self)

伟大的非常感谢。我还学到了一些新的东西——对象变异——也就是说,java对象在重新训练其引用对象时被调用改变了——我猜。
class Menu():
  def __init__(self, ui, title):
    self.__ui = ui
    self.__title = title
    self.__drawn = []

  def addItem(self, caption, functionName):
    self.__drawn.append(Item(caption, functionName))
    return self

  def addSeparator(self):
    self.__drawn.append(Line())
    return self

  def addSubMenu(self, other_menu):
    self.__drawn.append(other_menu)
    return self

  def addToUi(self):
    self.__ui.add(self)