diff --git a/lib/member_builder.js b/lib/member_builder.js index f467674..5daf630 100644 --- a/lib/member_builder.js +++ b/lib/member_builder.js @@ -319,12 +319,22 @@ function overrideMethod( super_method, new_method, instCallback ) { override = function() { + var context = instCallback( this ) || this, + retval = undefined + ; + // the _super property will contain the parent method this.__super = super_method; - var retval = new_method.apply( - ( instCallback( this ) || this ), arguments - ); + retval = new_method.apply( context, arguments ); + + // if the value returned from the method was the context that we + // passed in, return the actual instance (to ensure we do not break + // encapsulation) + if ( retval === context ) + { + return this; + } return retval; }; diff --git a/test/test-class-visibility.js b/test/test-class-visibility.js index a02fb71..61bf5c9 100644 --- a/test/test-class-visibility.js +++ b/test/test-class-visibility.js @@ -67,13 +67,25 @@ var common = require( './common' ), { return this; }, + + + 'public getSelfOverride': function() + { + // override me + }, }), // instance of Foo foo = Foo(), // subtype - SubFoo = Foo.extend( {} ), + SubFoo = Foo.extend({ + 'public getSelfOverride': function() + { + // return this from overridden method + return this; + }, + }), sub_foo = SubFoo() ; @@ -341,5 +353,12 @@ var common = require( './common' ), sub_foo, "Returning 'this' from a super method should return the subtype" ); + + // finally, overridden methods should still return the instance + assert.deepEqual( + sub_foo.getSelfOverride(), + sub_foo, + "Returning 'this' from a overridden method should return the subtype" + ); } )();