Как скопировать объект и его цепочку прототипов без вызова функции конструктора? - PullRequest
4 голосов
/ 19 декабря 2011

Как мне скопировать объект и его цепочку прототипов без вызова его функции конструктора?

Другими словами, как будет выглядеть функция dup в следующем примере?

class Animal
  @sleep: -> console.log('sleep')
  wake: -> console.log('wake')
end
class Cat extends Animal
  constructor: ->
    super
    console.log('create')

  attack: ->
    console.log('attack')
end

cat = new Cat()         #> create
cat.constructor.sleep() #> sleep
cat.wake()              #> wake
cat.attack()            #> attack

dup = (obj) ->
  # what magic would give me an effective copy without
  # calling the Cat constructor function again.

cat2 = dup(cat)          #> nothing is printed!
cat2.constructor.sleep() #> sleep
cat2.wake()              #> wake
cat2.attack()            #> attack

Насколько мне больно смотреть, вот пример jsfiddle .

Мне также понадобятся свойства, несмотря на то, что в моем примере используются только функции.

Ответы [ 2 ]

5 голосов
/ 19 декабря 2011
function dup(o) {
    return Object.create(
        Object.getPrototypeOf(o),
        Object.getOwnPropertyDescriptors(o)
    );
}

Что зависит от ES6 Object.getOwnPropertyDescriptors.Вы можете подражать этому. Взято из pd

function getOwnPropertyDescriptors(object) {
    var keys = Object.getOwnPropertyNames(object),
        returnObj = {};

    keys.forEach(getPropertyDescriptor);

    return returnObj;

    function getPropertyDescriptor(key) {
        var pd = Object.getOwnPropertyDescriptor(object, key);
        returnObj[key] = pd;
    }
}
Object.getOwnPropertyDescriptors = getOwnPropertyDescriptors;

Live Example

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

0 голосов
/ 19 декабря 2011

Вы должны использовать специальный член __proto__, который доступен в каждом объекте и является указателем на прототип класса объекта.Следующий код в чистом JavaScript:

function dup(o)
{
    var c = {};

    for (var p in o)
    {
        c[p] = o[p];
    }
    c.__proto__ =  o.__proto__;

    return c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...