2

Gas スクリプト ファイルで 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() syntaxを使用します。これはデフォルトで列挙不可に設定されています。コードを次のように変更した場合:

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

その後、期待どおりに動作するはずです。

Object.getOwnPropertyNames() は、列挙可能なプロパティと列挙できないプロパティの両方を返します。

ちなみに、これは ScriptDb に限ったことではありません。設計上、Apps Script API 関数にオブジェクトを渡すときに、列挙不可能なプロパティは保持されません。

于 2012-11-17T23:27:27.383 に答える