Les classes / objets JavaScript peuvent-ils avoir des constructeurs? Comment sont-ils créés?
javascript
oop
Cliquez Upvote
la source
la source
Réponses:
Utilisation de prototypes:
Masquer la "couleur" (ressemble un peu à une variable de membre privé):
Usage:
la source
color
. Je dirais que ce que vous utilisez est en grande partie dû à vos préférences personnelles (protection contre simplicité)var
fait une variable privée.this
rend une variable publiqueFoo
dans le cas de la fonction anonyme , tandis que dans ce dernier cas, elle saura qu'elleFoo
est appelée. Très utile pour le débogage.Voici un modèle que j'utilise parfois pour un comportement similaire à la POO en JavaScript. Comme vous pouvez le voir, vous pouvez simuler des membres privés (statiques et d'instance) à l'aide de fermetures. Ce
new MyClass()
qui retournera est un objet avec seulement les propriétés assignées à l'this
objet et dans l'prototype
objet de la "classe".On m'a posé des questions sur l'héritage en utilisant ce modèle, alors voici:
Et un exemple pour tout utiliser:
Comme vous pouvez le voir, les classes interagissent correctement entre elles (elles partagent l'identifiant statique de
MyClass
, laannounce
méthode utilise la bonneget_name
méthode, etc.)Une chose à noter est la nécessité de masquer les propriétés d'instance. Vous pouvez réellement faire passer la
inherit
fonction par toutes les propriétés d'instance (en utilisanthasOwnProperty
) qui sont des fonctions, et ajouter automatiquement unesuper_<method name>
propriété. Cela vous permettrait d'appelerthis.super_get_name()
au lieu de le stocker dans une valeur temporaire et de l'appeler lié à l'aidecall
.Pour les méthodes sur le prototype, vous n'avez pas à vous soucier de ce qui précède cependant, si vous voulez accéder aux méthodes de prototype de la super classe, vous pouvez simplement appeler
this.constructor.super.prototype.methodName
. Si vous voulez le rendre moins verbeux, vous pouvez bien sûr ajouter des propriétés de commodité. :)la source
cls.prototype
partie: "partagé entre les instances" sert uniquement à lire la valeur (appelannounce
). Si vous définissezmyClassInstance.announce
une autre valeur, il crée une nouvelle propriété dansmyClassInstance
, il ne s'applique donc qu'à cet objet, pas aux autres instances de la classe. L'affectation àMyClass.prototype.announce
affectera cependant toutes les instances.MyClass.get_nextId()
Il me semble que la plupart d'entre vous donnent des exemples de getters et setters qui ne sont pas des constructeurs, à savoir http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
lunched-dan était plus proche mais l'exemple ne fonctionnait pas dans jsFiddle.
Cet exemple crée une fonction constructeur privée qui ne s'exécute que lors de la création de l'objet.
Si vous souhaitez attribuer des propriétés publiques, le constructeur peut être défini comme tel:
la source
Box()
fonction :). Mais cet exemple ainsi que les exemples des autres réponses peuvent être facilement étendus pour accepter les paramètres.Box
fonction et vous êtes prêt à partir (c'est toujours "privé"). "Privé" en Javascript signifie simplement accessible via une portée lexicale; pas besoin d'affecter aux membres. De plus: ce code est erroné. Il crée une__construct
variable globale , ce qui est assez mauvais.var
devrait être utilisé pour restreindre la portée de__construct
.Le but de la propriété constructeur est de fournir un moyen de prétendre que JavaScript a des classes. L'une des choses que vous ne pouvez pas faire utilement est de modifier le constructeur d'un objet après sa création. C'est compliqué.
J'ai écrit un article assez complet à ce sujet il y a quelques années: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
la source
Exemple ici: http://jsfiddle.net/FZ5nC/
Essayez ce modèle:
Vous devez ajuster votre espace de noms si vous définissez une classe statique:
Exemple de classe:
Exemple d'instanciation:
Les fonctions d'avis sont définies comme AB = fonction A_B (). C'est pour rendre votre script plus facile à déboguer. Ouvrez le panneau Inspect Element de Chrome, exécutez ce script et développez la trace de débogage:
la source
Ceci est un constructeur:
Quand tu fais
MyClass
est exécuté et un nouvel objet est renvoyé de cette classe.la source
alert(valuePassedInAsArgument);
et cela s'exécutera une fois pour chaque instanciation, donc toute la classe est le constructeur lui-même.new object is returned of that class
- n'est-ce pas plutôt comme si un nouvel objet est renvoyé de cette fonction?J'ai trouvé ce tutoriel très utile. Cette approche est utilisée par la plupart des plug-ins jQuery.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Maintenant ,
la source
klass
Ce schéma m'a bien servi. Avec ce modèle, vous créez des classes dans des fichiers séparés, les chargez dans votre application globale "au besoin".
la source
var
dans le constructeur (ou argument de fonction, ou dans une fonction de type constructeur).Oui, vous pouvez définir un constructeur dans une déclaration de classe comme ceci:
la source
Je suppose que je posterai ce que je fais avec la fermeture javascript car personne n'utilise encore la fermeture.
Les commentaires et suggestions sur cette solution sont les bienvenus. :)
la source
En utilisant l'exemple de Nick ci-dessus, vous pouvez créer un constructeur pour les objets sans paramètres en utilisant une instruction return comme dernière instruction dans votre définition d'objet. Renvoyez votre fonction constructeur comme ci-dessous et elle exécutera le code dans __construct chaque fois que vous créez l'objet:
la source
this.getColor();
sur la ligne ci-dessus,alert("Object Created.");
rien ne sera alerté. Il y aura une erreur comme "getColor n'est pas défini". Si vous voulez que la construction puisse appeler d'autres méthodes dans l'objet, elle doit être définie après toutes les autres méthodes. Donc, au lieu d'appeler__construct();
sur la dernière ligne, définissez simplement la construction là-bas et mettez-la()
après pour la forcer à s'exécuter automatiquement.()
à la fin de la définition de __construct a toujours entraîné l'erreur. J'ai dû appeler__construct();
sur sa propre ligne comme dans le code d'origine pour éviter l'erreur.C'est peut-être devenu un peu plus simple, mais voici ce que j'ai trouvé maintenant en 2017:
En utilisant la classe ci-dessus, j'ai les éléments suivants:
Comme vous pouvez le voir, le constructeur prend deux paramètres et nous définissons les propriétés de l'objet. Nous modifions également la couleur et la forme de l'objet en utilisant les
setter
fonctions, et prouvons que son changement est resté lors de l'appelgetInfo()
après ces changements.Un peu tard, mais j'espère que cela vous aidera. J'ai testé cela avec un
mocha
test unitaire, et cela fonctionne bien.la source
Ils le font si vous utilisez Typescript - open source de MicroSoft :-)
Typescript vous permet de «fausses» constructions OO qui sont compilées en constructions javascript. Si vous démarrez un grand projet, cela peut vous faire gagner beaucoup de temps et il vient d'atteindre la version 1.0.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Le code ci-dessus est «compilé» pour:
la source
En JavaScript, le type d'invocation définit le comportement de la fonction:
func()
obj.func()
new func()
func.call()
oufunc.apply()
La fonction est invoquée en tant que constructeur lors de l'appel à l'aide de l'
new
opérateur:Toute instance ou objet prototype en JavaScript possède une propriété
constructor
, qui fait référence à la fonction constructeur.Consultez cet article sur la propriété constructeur.
la source
Tout en utilisant l'excellent modèle de Blixt d'en haut, j'ai découvert qu'il ne fonctionne pas bien avec l'héritage à plusieurs niveaux (MyGrandChildClass étendant MyChildClass étendant MyClass) - il passe en boucle en appelant le constructeur du premier parent encore et encore. Voici donc une solution de contournement simple - si vous avez besoin d'un héritage à plusieurs niveaux, au lieu d'utiliser l'
this.constructor.super.call(this, surName);
utilisationchainSuper(this).call(this, surName);
avec la fonction de chaîne définie comme ceci:la source
http://www.jsoops.net/ est assez bon pour oop dans Js. Si fournir une variable et une fonction privées, protégées et publiques, ainsi qu'une fonction d'héritage. Exemple de code:
la source
juste pour offrir une certaine variété. ds.oop est un bon moyen de déclarer des classes avec des constructeurs en javascript. Il prend en charge tous les types d'héritage possibles (y compris 1 type que même c # ne prend pas en charge) ainsi que les interfaces, ce qui est bien.
la source
Ici, nous devons noter un point dans le script java, c'est un langage sans classe cependant, nous pouvons y parvenir en utilisant des fonctions dans le script java. La façon la plus courante d'y parvenir consiste à créer une fonction dans un script java et à utiliser un nouveau mot-clé pour créer un objet et à utiliser ce mot - clé pour définir la propriété et les méthodes. Ci-dessous est l'exemple.
la source
Dans la plupart des cas, vous devez déclarer en quelque sorte la propriété dont vous avez besoin avant de pouvoir appeler une méthode qui transmet ces informations. Si vous n'avez pas à définir initialement une propriété, vous pouvez simplement appeler une méthode dans l'objet comme ceci. Ce n'est probablement pas la plus jolie façon de le faire, mais cela fonctionne toujours.
la source