diff --git a/index.js b/index.js index 6d6a826..21e4513 100644 --- a/index.js +++ b/index.js @@ -40,8 +40,12 @@ function debounce(function_, wait = 100, options = {}) { } const debounced = function (...arguments_) { - if (storedContext && this !== storedContext) { - throw new Error('Debounced method called with different contexts.'); + if ( + storedContext + && this !== storedContext + && Object.getPrototypeOf(this) === Object.getPrototypeOf(storedContext) + ) { + throw new Error('Debounced method called with different contexts of the same prototype.'); } storedContext = this; // eslint-disable-line unicorn/no-this-assignment diff --git a/test.js b/test.js index 054602e..26f89dd 100644 --- a/test.js +++ b/test.js @@ -147,7 +147,7 @@ test('forcing execution', async t => { }); test('context check in debounced function', async t => { - await t.test('should throw an error if debounced method is called with different contexts', async () => { + await t.test('should throw an error if debounced method is called with different contexts of the same class', async () => { function MyClass() {} MyClass.prototype.debounced = debounce(() => {}); @@ -157,15 +157,32 @@ test('context check in debounced function', async t => { instance1.debounced(); - let errorThrown = false; - try { + assert.throws(() => { instance2.debounced(); - } catch (error) { - errorThrown = true; - assert.strictEqual(error.message, 'Debounced method called with different contexts.', 'Error message should match'); - } + }, { + message: 'Debounced method called with different contexts of the same prototype.', + }, 'An error should have been thrown'); + }); + + await t.test('should not throw an error if debounced method is called with different contexts of different classes', async () => { + function MyClass1() {} + function MyClass2() {} + + const debouncedFunction = debounce(() => {}); + + MyClass1.prototype.debounced = debouncedFunction; + MyClass2.prototype.debounced = debouncedFunction; - assert.ok(errorThrown, 'An error should have been thrown'); + const instance1 = new MyClass1(); + const instance2 = new MyClass2(); + + instance1.debounced(); + + assert.doesNotThrow(() => { + instance2.debounced(); + }, { + message: 'Debounced method called with different contexts of the same prototype.', + }, 'An error should not have been thrown'); }); });