2013-02-21 5 views
1

Я имеюКак создать экземпляр, идентичный объект JS от существующего объекта JS

var a = { 
    f1: function() { 
     // Do Something 
    }, 
    f2: ['a','b','c'], 
    f3: 1234 
} 

Мне нужно создать что-то вроде этого

var b = Object.create(a); 

Но б не показывает мне, что она содержит любой из свойства a!

+0

'' '' '' '' как прототип, так что, если вы не перезаписываете одно и то же свойство на 'b', они будут проверяться на' a' при доступе. – Yoshi

+0

точный дубликат [Копирование объекта в Javascript] (http://stackoverflow.com/questions/728360/copying-an-object-in-javascript) – Bergi

+0

Извините, потому что я написал свой ответ, но у меня была небольшая ошибка , Проверьте это, потому что теперь я исправил его, а также написал лучшее описание. Обратите внимание, что это всего лишь код JavaScript, который лучше всего изучает продвинутые аспекты языка, но вы можете использовать метод расширения jQuery слишком хорошо? :) – albertoblaz

ответ

2

Вы можете создать функцию клонирования, делать что-то вроде этого:

var clone = function(obj) { 

    // Create a new object using the same prototype as the original object 
    var cloned = Object.create(obj);  

    // Copy each property from 'obj' to 'cloned' 
    for (p in obj) {  
     if (obj.hasOwnProperty(p)) { 
      cloned[p] = obj[p]; 
     } 
    } 

    return cloned;  // Return the cloned object 
} 

EDIT: Будьте осторожны с первым оператором, чтобы создать клонированный объект из оригинал.

  1. Вы должны заметить, что если вы пишете var cloned = {};, как я делал раньше, прототипы будут отличаться, так что это решение не будет работать должным образом на 100%, потому что если вы используете оператор instanceof, он будет возвращать false.

  2. Если вы используете только var cloned = Object.create(obj);, как описывают другие ответы, вы просто получите клонированный объект с аналогичным прототипом, чем прототип оригинала. Но вам также нужно скопировать свойства из исходного объекта и прикрепить их к клонированной версии. Вот почему мы должны использовать for-loop.

Наконец, если второй предыдущий подход, использующий Object.create не работает в вашем браузере, потому что у него есть наследие JavaScript двигателя, то вы должны использовать небольшой обходной путь в следующем.

function F() {}; 
F.prototype = obj.prototype; 
var cloned = new F(); 

Надеюсь, это поможет! :)

0

Использование prototype:

var b = Object.create(a.prototype); 

Object.create Создает новый объект с указанным объектом прототипа и свойств.

Он ожидает, что прототип для вновь созданного объекта: Object.create(proto [, propertiesObject ])

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

+1

'a' не имеет свойства« прототипа »! – Bergi

+0

@ Darren Davies @Bergi, может быть, вы можете использовать '.__ proto__', но я думаю, что это нестандартное свойство. Даже, я попробовал на моей консоли, но это не сработало для меня :( – albertoblaz

+0

@albertoblaz: Нет, определенно нет.'Object.create (a .__ proto __)' будет равен 'var b = {};'. – Bergi

0

Другой способ сделать это, используя JQuery функция Jquery.extend. Вы можете использовать его как это:

var b = jQuery.extend({},a); 
+0

Вы можете подключить несколько объектов и создать сложный сложный объект путем объединения его свойств –

Смежные вопросы