diff --git a/src/Angular.js b/src/Angular.js index 21ce1ff7282d..8e315fb77e76 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -772,7 +772,7 @@ function shallowCopy(src, dst) { for(var key in src) { // shallowCopy is only ever called by $compile nodeLinkFn, which has control over src // so we don't need to worry about using our custom hasOwnProperty here - if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') { + if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) { dst[key] = src[key]; } } diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 055f089023ad..1ab31bf55609 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -35,7 +35,7 @@ function shallowClearAndCopy(src, dst) { }); for (var key in src) { - if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') { + if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) { dst[key] = src[key]; } } diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 7fe65f4c8051..117e8fb0a39f 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -190,7 +190,7 @@ describe('angular', function() { expect(copy.key).toBe(original.key); }); - it('should not copy $$ properties nor prototype properties', function() { + it('should omit "$$"-prefixed properties', function() { var original = {$$some: true, $$: true}; var clone = {}; @@ -198,6 +198,27 @@ describe('angular', function() { expect(clone.$$some).toBeUndefined(); expect(clone.$$).toBeUndefined(); }); + + it('should copy "$"-prefixed properties from copy', function() { + var original = {$some: true}; + var clone = {}; + + expect(shallowCopy(original, clone)).toBe(clone); + expect(clone.$some).toBe(original.$some); + }); + + it('should omit properties from prototype chain', function() { + var original, clone = {}; + function Func() {}; + Func.prototype.hello = "world"; + + original = new Func(); + original.goodbye = "world"; + + expect(shallowCopy(original, clone)).toBe(clone); + expect(clone.hello).toBeUndefined(); + expect(clone.goodbye).toBe("world"); + }); }); describe('elementHTML', function() { diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 08c27a0f715b..1c0b73b9d158 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -94,6 +94,49 @@ describe("resource", function() { }); + describe('shallow copy', function() { + it('should make a copy', function() { + var original = {key:{}}; + var copy = shallowClearAndCopy(original); + expect(copy).toEqual(original); + expect(copy.key).toBe(original.key); + }); + + + it('should omit "$$"-prefixed properties', function() { + var original = {$$some: true, $$: true}; + var clone = {}; + + expect(shallowClearAndCopy(original, clone)).toBe(clone); + expect(clone.$$some).toBeUndefined(); + expect(clone.$$).toBeUndefined(); + }); + + + it('should copy "$"-prefixed properties from copy', function() { + var original = {$some: true}; + var clone = {}; + + expect(shallowClearAndCopy(original, clone)).toBe(clone); + expect(clone.$some).toBe(original.$some); + }); + + + it('should omit properties from prototype chain', function() { + var original, clone = {}; + function Func() {}; + Func.prototype.hello = "world"; + + original = new Func(); + original.goodbye = "world"; + + expect(shallowClearAndCopy(original, clone)).toBe(clone); + expect(clone.hello).toBeUndefined(); + expect(clone.goodbye).toBe("world"); + }); + }); + + it('should default to empty parameters', function() { $httpBackend.expect('GET', 'URL').respond({}); $resource('URL').query();