From e0fb37daa06a1fc71681222a80b37a340b0deee6 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Thu, 10 Mar 2011 12:40:55 -0500 Subject: [PATCH] Overridden methods now property return instance when returning 'this' - There may be a cleaner way to do this. This is a quick fix. --- lib/member_builder.js | 16 +++++++++++++--- test/test-class-visibility.js | 21 ++++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) 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" + ); } )();