# angular.Object.copy

## Description

Creates a deep copy of `source`.

If `source` is an object or an array, all of its members will be copied into the `destination` object.

If `destination` is not provided and `source` is an object or an array, a copy is created & returned, otherwise the `source` is returned.

If `destination` is provided, all of its properties will be deleted.

Note: this function is used to augment the Object type in angular expressions. See `angular.Object` for more info.

## Usage

    angular.Object.copy(source[, destination]);

### Parameters

- `source – {*} –`

  The source to be used to make a copy. Can be any type including primitives, `null` and `undefined`.

- `destination(optional) – {(Object|Array)} –`

  Optional destination into which the source is copied. If provided, must be of the same type as `source`.

### Returns

`{*}` –

The copy or updated `destination` if `destination` was specified.

## Example

        Salutation: <input type="text" name="master.salutation" value="Hello" /><br/>
        Name: <input type="text" name="master.name" value="world"/><br/>
        <button ng:click="form = master.$copy()">copy</button>
        <hr/>

        The master object is <span ng:hide="master.$equals(form)">NOT</span> equal to the form object.

        <pre>master={{master}}</pre>
        <pre>form={{form}}</pre>

      it('should print that initialy the form object is NOT equal to master', function() {
        expect(element('.doc-example-live input[name=master.salutation]').val()).toBe('Hello');
        expect(element('.doc-example-live input[name=master.name]').val()).toBe('world');
        expect(element('.doc-example-live span').css('display')).toBe('inline');
      });

      it('should make form and master equal when the copy button is clicked', function() {
        element('.doc-example-live button').click();
        expect(element('.doc-example-live span').css('display')).toBe('none');
      });