Скопировать объект с результатами геттеров

У меня есть объект, содержащий геттер.

myObject {
    id: "MyId",
    get title () { return myRepository.title; }
}

myRepository.title = "MyTitle";

Я хочу получить объект вроде:

myResult = {
    id: "MyId", 
    title: "MyTitle"
}

Я не хочу копировать получателя, так:

myResult.title;                       // Returns "MyTitle"
myRepository.title = "Another title";
myResult.title;                       // Should still return "MyTitle"

Я попробовал:

  • $. extend(): Но он не перебирает геттеры. http://bugs.jquery.com/ticket/6145
  • Итерация свойств, предложенных здесь, но она не перебирает геттеры.
  • Как я использую angular, используя Angular.forEach, как предложено здесь. Но я получаю только свойства, а не получатели.

Любая идея? спасибо!

Обновление Я устанавливал getter с помощью Object.defineProperty как:

 "title": { get: function () { return myRepository.title; }},

Как можно прочитать в документе:

перечислимый true тогда и только тогда, когда это свойство появляется во время перечисление свойств на соответствующем объекте. По умолчанию ложь.

Настройка перечислимого: true исправить проблему.

"title": { get: function () { return myRepository.title; }, enumerable: true },

Ответ 1

$.extend делает именно то, что вы хотите. ( Обновление: с тех пор вы сказали, что хотите неперечислимые свойства, так что это не делает вы хотите, см. вторую часть этого ответа ниже, но я оставлю первый бит для других.) Ошибка не говорит о том, что результирующий объект не будет иметь свойство title, он говорит, что результирующий объект title свойство не будет получателем, что идеально подходит для того, что вы сказали, что хотите.

Пример с правильным синтаксисом getter:

// The myRepository object
var myRepository = { title: "MyTitle" };

// The object with a getter
var myObject = {
    id: "MyId",
    get title() { return myRepository.title; }
};

// The copy with a plain property
var copy = $.extend({}, myObject);

// View the copy (although actually, the result would look
// the same either way)
snippet.log(JSON.stringify(copy));

// Prove that the copy `title` really is just a plain property:
snippet.log("Before: copy.title = " + copy.title);
copy.title = "foo";
snippet.log("After:  copy.title = " + copy.title);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Ответ 2

Прежде всего, исправьте свой синтаксис, хотя он, вероятно, хорош в вашем фактическом коде:

myObject = {
    id: "MyId",
    get title () { return myRepository.title; }
}

Теперь, к ответу.:)

Вы можете просто использовать цикл for..in для получения всех свойств, а затем сохранить их как есть:

var newObj = {};
for (var i in myObject) {
    newObj[i] = myObject[i];
}

Нет jQuery, Angular, любые другие необходимые плагины!