Les moyens d'étendre la Matrice de l'objet en javascript
j'essaie d'étendre l'objet de Tableau en javascript avec des méthodes respectueuses de type Array.Ajouter() à la place de Tableau.push (), etc...
- je mettre en œuvre 3 façons de le faire.
unfortunetly la 3ème voie n'est pas de travail et j'ai envie de demander pourquoi? et comment le faire fonctionner.
//------------- 1st way
Array.prototype.Add=function(element){
this.push(element);
};
var list1 = new Array();
list1.Add("Hello world");
alert(list1[0]);
//------------- 2nd way
function Array2 () {
//some other properties and methods
};
Array2.prototype = new Array;
Array2.prototype.Add = function(element){
this.push(element);
};
var list2 = new Array2;
list2.Add(123);
alert(list2[0]);
//------------- 3rd way
function Array3 () {
this.prototype = new Array;
this.Add = function(element){
this.push(element);
};
};
var list3 = new Array3;
list3.Add(456); //push is not a function
alert(list3[0]); //undefined
dans la 3ème voie que je veux étendre le Tableau d'objet interne Array3 classe.
Comment faire en sorte de ne pas devenir "push n'est pas une fonction" et "undefined"?
Ici, j'ai ajouter un 4ème.
//------------- 4th way
function Array4 () {
//some other properties and methods
this.Add = function(element){
this.push(element);
};
};
Array4.prototype = new Array();
var list4 = new Array4();
list4.Add(789);
alert(list4[0]);
Ici j'ai utiliser prototype.
J'espère pour éviter d'utiliser des lignes supplémentaires à l'extérieur de constructeur de classe comme Array4.le prototype.
Je voulais avoir un compact classe définie avec toutes les pièces en un seul endroit.
Mais je pense que je ne peux pas faire autrement.
- Si vous ajoutez une méthode de Matrice de vous briser foreach() sur les tableaux
- Avez-vous regardé dans le café script? Je vais mettre à jour ma réponse avec un exemple
- je ne vais pas ajouter une méthode à la Matrice.prototype comme dans le 1er exemple. C'était un test. Je vais créer une classe qui permettra d'étendre l'objet de Tableau. Par exemple jsArray. Le jsArray objets seront des Tableaux, mais avec plus de fonctionnalités.
- j'ai vu aujourd'hui le café de script. je n'ai pas aimé sa syntaxe.
- si quelqu'un utilise mon personnalisée lib js peut régler sa foreach() de ne pas inclure les 2 derniers éléments de l'énumération de cause, il est le type de l'objet et de sa longueur.
- Dans tous les exemples que vous étendre Tableau dans un nouveau type (par exemple, Array3). Existe-il des raisons de ne pas prolonger un Tableau, comme l'OP premier exemple?
Array.prototype.add = Array.prototype.push;
Vous devez vous connecter pour publier un commentaire.
Noms de méthode doivent être en minuscules. Prototype ne doit pas être modifié dans le constructeur.
en CoffeeScript
Si vous n'aimez pas cette syntaxe, et vous devez l'étendre à partir de l'intérieur du constructeur,
Votre seule option est de:
Vous pourriez aussi le faire
Dans les anciens temps, 'prototype.js" l'habitude d'avoir une Classe.méthode de création. Vous pouvez rassembler tous c'est une méthode comme ça
Pour plus d'info sur ce sujet et sur la façon de mettre en œuvre, regardez dans le prototype.js le code source
Array3.prototype = new Array;
et pasnew Array();
? (avec et sans les parenthèses). Merci.ES6
À l'aide de
__proto__
(ancienne réponse, n'est pas recommandé, peut causer des les problèmes de performances)
Maintenant, vous pouvez ajouter à vos méthodes de
SubArray
Initialiser comme des Tableaux normaux
Se comporte comme des Tableaux normaux
__proto__
est pris en charge dans la plupart des implémentations de JavaScript, ce n'est pas une fonction standard jusqu'à être marqué comme un héritage de la fonctionnalité dans l'es6. Il peut aussi causer des problèmes de performance si largement utilisé. Son utilisation est généralement une mauvaise idée.constructor
àsuper
, comme ceci:constructor(...items) {super(...items) }
Dans votre troisième exemple vous êtes tout simplement la création d'une nouvelle propriété nommée
prototype
pour l'objetArray3
. Lorsque vous nenew Array3
qui devrait êtrenew Array3()
, vous êtes l'instanciation de l'objet dans la variablelist3
. Par conséquent, laAdd
méthode ne fonctionnera pas parce quethis
, qui est l'objet en question, n'a pas une méthode valablepush
. J'espère que vous comprenez.Edit: découvrez La Compréhension Contexte JavaScript pour en savoir plus sur
this
.()
lorsque vous instancier des objets.Array
est aussi un objet de sortenew Array()
(ou typiquement juste[]
). Cela fonctionne parce que les navigateurs sont intelligents.Il y a un moment, j'ai lu le livre Javascript Ninja écrit par John Resig, le créateur de jQuery.
Il a proposé une façon d'imiter tableau des méthodes de type avec un simple JS objet. En gros, seulement
length
est nécessaire.Je ne veux pas dire qu'il est bon ou mauvais. C'est une façon originale de faire
Array
opérations. L'avantage est que vous n'étendez pas leArray prototype
.Gardez à l'esprit que
obj
est une plaineobject
, ce n'est pas uneArray
. Doncobj instanceof Array
sera de retourfalse
. Pensezobj
comme un façade.Si ce code est d'intérêt pour vous, lire l'extrait Listing 4.10 Simulant le tableau des méthodes de type.
Sont que vous essayez de faire quelque chose de plus compliqué puis il suffit d'ajouter un alias pour "pousser" appelé "Ajouter"?
Si non, il serait probablement mieux éviter de le faire. La raison je suggère c'est une mauvaise idée, c'est que parce que la Matrice est un builtin javascript type, la modification, il sera la cause de tous les scénarios de type Tableau pour avoir de nouvelles "Ajouter" de la méthode. Le potentiel pour le nom des affrontements avec un autre tiers sont élevés et pourraient causer la troisième partie du script de perdre sa méthode en faveur de votre one.
Mon général, la règle est de faire une fonction d'aide à travailler sur la Matrice si elle n'existe pas déjà quelque part et ne s'étend Tableau si elle est extrêmement nécessaire.
Vous NE pouvez pas étendre l'Objet de Tableau en JavaScript.
Au lieu de cela, ce que vous pouvez faire est de définir un objet qui contiendra une liste de fonctions qui effectuent sur le Tableau, et d'injecter ces fonctions dans ce Tableau d'instance et le rendement de cette nouvelle instance de l'objet Array. Ce que vous ne devriez pas faire est de changer le
Array.prototype
pour inclure vos fonctions personnalisées sur la liste.Exemple:
Juste un exemple de code, vous pouvez le modifier et l'utiliser comme vous le souhaitez. Mais le concept sous-jacent je vous conseille de suivre reste la même.
prototype
. Il est toujours préférable d'attribuer des propriétés de l'existantprototype
objet.Vous pouvez également utiliser ce moyen dans l'ES6:
Résultat:
La réponse est un compact solution qui fonctionne comme prévu dans l'ensemble des justificatifs des navigateurs.