Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to overload the Set Class

How would I overload the Set.prototype.add method, for example I’m trying to do:

// allow overloading the Set().method function by passing multiple arguments
Set.prototype.add = function(x) {
    for (let x of arguments) {
        super.add(x); // doesn't Set act like a class?
    }
    return this;
}
let s = new Set([1,2,3]);
s.add(4,5,6);
console.log("Set: ", s);
// 'super' keyword unexpected here

Or do I need to alias it like this so I can call the parent via Function.call/apply, such as:

Set.prototype.addMultiple = function(x) {
    for (let x of arguments) {
        Set.prototype.add.call(this, x);
    }
    return this;
}
let s = new Set([1,2,3]);
s.addMultiple(4,5,6);
console.log("Set: {" + Array.from(s) + "}");

Or, what about just aliasing the original method, is that considered ok? (or does Set.prototype._add = Set.prototype.add; have unintended side effects?):

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Set.prototype._add = Set.prototype.add;
Set.prototype.add = function(x) {
    for (let x of arguments) {
        Set.prototype._add.call(this, x);
    }
    return this;
}

let s = new Set([1,2,3]);
s.add(4,5,6);
console.log(`Set: {${Array.from(s)}}`);

>Solution :

You don’t need all of these fancy features; just this:

Set.prototype.addMultiple = function(x) {
    for (let x of arguments) {
        this.add(x);
    }
    return this;
}

While we’re at it, let’s use const instead in the loop:

for (const x of arguments) {

And also arguments? That’s some 2010 code. Nowadays we use spread/variadic arguments:

Set.prototype.addMultiple = function (...args) {
    for (const x of args) { ... }
     
    // rest omitted
}

Keep in mind that extending/modifying native prototypes is generally frowned upon, so you’re better off extending the class instead.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading