function Scope() {
      this.$id = nextUid();
      this.$$phase = this.$parent = this.$$watchers =
                     this.$$nextSibling = this.$$prevSibling =
                     this.$$childHead = this.$$childTail = null;
      this.$root = this;
      this.$$destroyed = false;
      this.$$listeners = {};
      this.$$listenerCount = {};
      this.$$watchersCount = 0;
      this.$$isolateBindings = null;
    }
@ngdoc type
@name $rootScope.Scope

@description
A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the
{@link auto.$injector $injector}. Child scopes are created using the
{@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when
compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for
an in-depth introduction and usage examples.


# Inheritance
A scope can inherit from a parent scope, as in this example:
```js
         var parent = $rootScope;
         var child = parent.$new();

         parent.salutation = "Hello";
         expect(child.salutation).toEqual('Hello');

         child.salutation = "Welcome";
         expect(child.salutation).toEqual('Welcome');
         expect(parent.salutation).toEqual('Hello');
```

When interacting with `Scope` in tests, additional helper methods are available on the
instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional
details.


@param {Object.<string, function()>=} providers Map of service factory which need to be
                                      provided for the current scope. Defaults to {@link ng}.
@param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should
                             append/override services provided by `providers`. This is handy
                             when unit-testing and having the need to override a default
                             service.
@returns {Object} Newly created scope.