2

我一直在尝试在气体脚本文件中使用 Object.create。Object.create 已定义,但似乎没有返回有用的对象。

function createOject() {
  var o = Object.create({}, { p: { value: 42 } })
  Logger.log(o.p); //logs 42.0 as expected
  var db = ScriptDb.getMyDb();
  db.save(o);  //o still shows up as empty {} in the debugger and 
               //won't save to data store
  showTable(); //logs nothing
}

此代码工作正常:

  function createOject() {
    var o = {p: 42};
    Logger.log(o.p); //logs 42.0 as expected
    var db = ScriptDb.getMyDb();
    db.save(o);  //o shows up as an object {p: 42} in the debugger and 
                 //saves to the the data store as expected
    showTable(); //logs {p: 42} as expected
}

因此,尽管 Object.create 已定义,但它似乎并没有按预期工作。这是一个错误还是我错过了什么?

4

2 回答 2

2

ScriptDb 不保存不可枚举的属性。Object.create() 使用Object.defineProperties() 语法,默认为不可枚举。如果您将代码更改为此:

var o = Object.create({}, { p: { value: 42, enumerable: true } })

那么它应该可以按您的预期工作。

Object.getOwnPropertyNames() 返回可枚举和不可枚举的属性。

顺便说一句,这不仅适用于 ScriptDb... 在将对象传递给 Apps Script API 函数时,根据设计,永远不会保留不可枚举的属性。

于 2012-11-17T23:27:27.383 回答
0

2021 年的更新*。Object.create(your_obj) 仍然无法按照您在 Google Apps 脚本中所期望的方式执行,因为它不保存不可枚举的属性(原文如此。Corey G.)。

随着 Google Apps Script 转向 V8 引擎,您现在可以利用一些现代 Javascript 方法。

您可以考虑使用传播语法(示例 1)基于一个或多个对象生成新对象,或尝试Object.assign()(示例 2)添加到当前对象。两种方法都会生成对象的浅层克隆。

function test(){
  const a = {name:"Yagi", species:"goat"}
  const b = {hobby:"coding", friendly:true}



  //Example 1
  const c = {...a,...b}

  console.log("c: ",c)

  //Example 2
  Object.assign(a, b); //Assigns 'b' (or multilpes objects) to 'a'

  console.log("a: ", a)
}

顺便说一句,scriptDB 在 2014 年贬值了

*注意:这是与搜索“Object.create() Google Apps Script”最接近的问题。此更新的答案响应搜索此问题的用户。

于 2021-09-01T23:07:09.120 回答