3

I am trying to modify Javascripts Array type with a method which will push a value to an array only if its is not already present.

Here is my code:

// add a method conditionally
Array.prototype.method = function (name, func){
    if(!this.prototype[name]){
        this.prototype[name] = func;
        return this;
    }
};

// exclusive push
Array.method('xadd', function(value){
    if(this.indexOf(value) === -1){
        this.push(value)
    };
    return this;
});

However when I run the code the scratchpad in Firefox returns:

/*
Exception: TypeError: Array.method is not a function
@Scratchpad/3:19:1
*/

I want a vanilla way of doing this. Not a library as I am writing an open source library.

timebandit
  • 794
  • 2
  • 11
  • 26

3 Answers3

2

When you're putting a method on Array.prototype the method will be available on the instances of Array.

// Add the custom method
Array.prototype.method = function() {
    console.log('XXX');
}

var foo = [];
// prints XXX
foo.method();
Nihey Takizawa
  • 797
  • 5
  • 8
2

First I would run a check to see if the method is already on the array. Don't go overridding existing prototype methods. In addition, you're not adding func to the prototype - you're adding it to the instances you'll be creating.

if (!('method' in Array.prototype)) {
    Array.prototype.method = function (name, func) {
        if (!this[name]) this[name] = func;
    }
}

Then you need to actually create your array instance:

var arr = [1,2];

At which point you can use the method you created to add the function. Note in your question your check was incorrect:

arr.method('xadd', function (value) {
    if (this.indexOf(value) === -1) {
        this.push(value)
    };
});

arr.xadd(3); // [1,2,3]

DEMO

Andy
  • 61,948
  • 13
  • 68
  • 95
  • Ok almost there. My intention is to modify the Array type so that **xadd** is available to all instances of array. My initial code was thought to be the way to do this. Manually adding it to instances of arrays is too much work. – timebandit Jun 20 '15 at 22:11
  • It *is* available to all instances of array. – Andy Jun 20 '15 at 23:16
0

Borrowing from Andy & Nihey I have arrived at the following solution which modifies the Array type making 'xadd' conditionally available to all instances of Array

if (!('xpush' in Array.prototype)) {
  Array.prototype.xpush = function(value){
    if(this.indexOf(value) === -1){
      this.push(value);
    };
    return this
  };
}

var a = [1,2,3];
console.log(a); // Array [ 1, 2, 3 ]
a.xadd(5);
console.log(a); // Array [ 1, 2, 3, 5 ]
a.xadd(3);
console.log(a); // Array [ 1, 2, 3, 5 ] '3' already present so not added

A better name would be xpush() as it's behaviour is a variant of push().

timebandit
  • 794
  • 2
  • 11
  • 26