7
votes

Est-il possible de déterminer si un objet créé avec objet.create hérite d'une matrice en JavaScript?

Identifier quels objets sont lesquels est compliqué en JavaScript et FIMPING SUR Quels objets sont des tableaux a quelque chose d'un Solution Hacky . Heureusement, il réussit à travailler dans les deux cas suivants:

function inherits(obj, proto) {
    while (obj != null) {
        if (obj == proto) return true;
        obj = Object.getPrototypeOf(obj);
    }
    return false;
}

inherits(Object.create(Array.prototype), Array.prototype);  // true


3 commentaires

Je suis juste curieux: pourquoi voudriez-vous jamais créer un tableau comme ça? objet.create (array.prototyp); et vérifiez-le via objet.pototype.tostring.call (arr);


@ ZIM84: Je pense que ce n'est qu'un exemple. Dans de vraies applications, nous ne devrions jamais faire cela. Dans les applications réelles, l'objet.create (Array.ProTotype) peut être appelé ailleurs et transmettre l'objet créé à une autre fonction


Le problème est que vous n'avez pas vraiment de véritable tableau (par exemple, il n'a pas la propriété magique , juste une seule qui ressemble à première vue). Ce que vous avez est un tableau, comme il arrive d'avoir toutes les méthodes d'un véritable tableau. Si vous souhaitez rechercher des goûts, vous devriez essentiellement simplement voir si elle a une propriété et n'est pas une chaîne. C'est le meilleur imo. Si vous souhaitez vérifier les érayes true, continuez à utiliser objet.pototype.tostring.call ou array.isarray et savoir qu'un objet avec prototype de array.pototype n'est pas nécessairement un véritable tableau.


5 Réponses :


2
votes

Que diriez-vous d'un instanceof opérateur? Il renvoie true pour tous vos cas: xxx

Cependant: xxx

SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO. >


2 commentaires

L'instanceof Array ne fournit pas de manière fiable de vérifier lorsque nous passons des tableaux entre les cadres, car chaque cadre a son propre constructeur de tableau


Ceci est une solution raisonnable pour les environnements ou les nœuds unique. Gardez simplement à l'esprit le problème multi-cadre.



2
votes

ECMAScript 5 a introduit array.isarray () code> dans JavaScript qui fournit un moyen fiable de vérifier. Pour les navigateurs plus anciens, nous résolvons cela par (cité à partir de ce Book )

var arr = Object.create(Array.prototype);
var arr1 = Object.create(Object.create(Array.prototype));
var arr2 = new Array();
var arr3 = [];
isArray(arr); 
isArray(arr1); 
isArray(arr2); 
isArray(arr3); 


6 commentaires

array.isarray est exactement identique que objet.pototype.tostring.call (arr) == '[Array d'objet]' . Cette solution ne fonctionnera pas si le prototype de l'objet est un objet qui a un prototype qui est un tableau. var arr = objet.create (objet.create (array.pototype));


@Nathanwall: Jetez un coup d'oeil à ce Réservez


Regarde mieux. Juste un Nitpick: il ne teste pas si quelque chose est un véritable tableau (comme décrit dans mon commentaire à la question initiale). Cela teste vraiment si quelque chose a été construit comme une matrice ou hérite de quelque chose qui a été construit comme une matrice (qui est différent). Donc, peut-être que "isarray" n'est pas le meilleur nom de la fonction. Cependant, cette solution satisfait à la question initiale et est probablement la meilleure que l'astucieux puisse accéder à ses conditions. Il doit juste être conscient de ce qui se passe vraiment.


@Nathanwall: mise à jour pour tester également l'objet actuel. Merci d'avoir souligné.


Ce que vous avez fait est essentiellement implémenter isprototypeof vous-même. isprototypeof marche la chaîne pour vous, comme vous le faites manuellement.


@Torazaburo je suppose que la question est alors si isprototypeof a les mêmes problèmes avec plusieurs fenêtres que instanceof ( source ). (Je ne sais pas)



0
votes

Que diriez-vous de vérifier le constructeur? XXX


0 commentaires

2
votes

voir http: // perfectionkills.com/how-ecmascript-5-still-does-not-ve-a-subclass-an-array/ pour l'exposition définitive des problèmes d'héritage de la matrice.

Quoi qu'il en soit, dans le plus simple cas, où vous faites xxx

Vous pouvez vérifier en utilisant isprototypeof : xxx

Voir https://developer.mozilla.org/fr -Us / Docs / Web / JavaScript / Référence / Global_Objects / Objet / IsPrototype de .


0 commentaires

0
votes

Il fonctionne comme une matrice, et à toutes fins, il s'agit d'une graisse

non. Il n'a aucune mise à jour automatique propriété . Voir Cet article Pourquoi Il est tout à fait impossible pour la sous-classe Array .

Y a-t-il un moyen de déterminer si un objet hérite d'un prototype particulier? Je suppose que vous pouviez parcourir les prototypes, mais cela ressent un TAD Hacky.

C'est juste comment le faire. Une approche plus propre qu'une fonction auto-écrite consisterait à utiliser le < code> instanceof opérateur : xxx


0 commentaires