2017-07-13 2 views
0

Je sais qu'il est possible de passer outre les fonctions de JS comme ceci:Remplacer indexOf() pour un appel de null

var indexOf = String.prototype.indexOf; 
String.prototype.indexOf = function(){ 
    //MY CODE HERE 
    return indexOf.call(this, arguments); 
}; 

C'est prépondérant indexOf() appelé à partir d'une chaîne. Est-il possible de remplacer indexOf() qui sera appelée à partir de null? var a = null; a.indexOf("foo") doit renvoyer -1. Mal, n'est-ce pas?

+2

autant que je sache, il est impossible. –

+1

'null' dans JS est une valeur primitive. Ce n'est pas un objet et n'a pas de méthodes. – hindmost

+0

En outre tous les très bons commentaires, envelopper la fonction avec votre fonction et retourner '-1' si l'objet est nul. –

Répondre

2

var a = null, 
 
b = 'foobar'; 
 
console.log((a+'').indexOf('foo')); 
 
console.log((b+'').indexOf('foo'));

Concatenate null à chaîne puis vérifiez, si vous voulez vraiment de indexOf

+0

Merci, mais cela ne fonctionne pas pour moi, car je ne peux pas éditer le Vars avant d'appeler indexOf(). – bor32

+0

Idée intéressante :) @ bor32 Pourquoi avez-vous besoin d'éditer les vars? Pouvez-vous modifier la ligne qui appelle la méthode 'indexOf'? –

+0

@ bor32 ajoute '' ''avant de vérifier' .indexOf'. – Escoute

1

null (et undefined) ne supportent pas accès à la propriété (l'opérateur point), autrement dit , null.whatever ne fonctionne jamais. Donc, ce que vous cherchez n'est pas possible. Reference.

De plus, certaines méthodes (la plupart?) Intégrées, y compris indexOf ne prennent pas en charge les liaisons null, donc ''.indexOf.call(null,...) ne fonctionnera pas non plus.

Je comprends la raison d'être à votre question, avoir des méthodes sur nulls peuvent être utiles dans des contextes « carte-Invoke », comme

source.map(x => x.someMethod()) 

où vous voulez retourner une valeur par défaut pour NULLS/undefineds qui pourraient se produire dans la source. Malheureusement, il semble y avoir aucun moyen de le faire de façon concise, vous devez fournir une enveloppe de sécurité pour d'éventuelles nulls:

source.map(x => invoke(x, func)) 

invoke est quelque chose comme return x === null ? null : func.apply(x)

Exemple complet:

let isNull = x => x === null || typeof x === 'undefined'; 
 

 
let invoke = (func, ...args) => x => isNull(x) ? null : func.apply(x, args); 
 

 
a = ['foo', 'bar', null, 'bbaazz']; 
 

 
// z = a.map(x => x.indexOf('a')) // this will fail 
 

 
z = a.map(invoke(''.indexOf, 'a')); // this works 
 

 
console.log(z);

+0

Merci d'avoir répondu! Bonnes suggestions. Je verrai :-) – bor32