Использование Object.create в файле сценария [google-apps-script] в Chrome на Chromebook

Я пытался использовать 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 определен, он не работает должным образом. Это ошибка или я что-то упустил?

2 ответа

ScriptDb не сохраняет не перечисляемые свойства. Object.create() использует синтаксис Object.defineProperties(), который по умолчанию не перечисляется. Если вы измените свой код на это:

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

тогда это должно работать, как вы ожидали.

Object.getOwnPropertyNames () возвращает как перечислимые, так и не перечислимые свойства.

Между прочим, это не только для ScriptDb... неперечислимые свойства никогда не сохраняются при передаче объекта в функцию API скрипта Apps, в соответствии с дизайном.

Обновление на 2021 год *. Object.create(your_obj) по-прежнему не работает так, как вы могли бы ожидать от Google Apps Script, потому что он не сохраняет неперечислимые свойства (так в оригинале Corey G.).

С переходом Google Apps Script на движок V8 теперь вы можете воспользоваться преимуществами некоторых современных методов Javascript.

Вы можете использовать синтаксис Spread (пример 1) или попробовать Object.assign() (пример 2) для создания неглубокого клона объектов.

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


  //Example 1
  const c = Object.assign(a, b);

  console.log("c: ", c)

  //Example 2
  const d = {...a,...b}

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

Кстати, scriptDB обесценилась в 2014 году .

*Примечание. Этот вопрос был наиболее близким к поисковому запросу "Object.create() Google Apps Script". Этот обновленный ответ предназначен для пользователей, ищущих эту проблему.

Другие вопросы по тегам