La déclaration d'une fonction membre dans le JS
J'ai essayé les deux façons de déclarer un membre de la fonction en JS:
function init() {
var name = "Mozilla";
function displayName() {
alert(name);
}
}
a = new init();
a.displayName()
Et
function init() {
var name = "Mozilla";
displayName = function() {
alert(name);
}
}
a = new init();
a.displayName()
La première méthode m'a dit que displayName()
est undefined
. La façon dont je le vois d'une variable de type Function
avec nae displayName
est créé, et donc il faut travailler.
Un soin d'expliquer pourquoi il n'a pas de travail?
Grâce
OriginalL'auteur Yotam | 2012-12-04
Vous devez vous connecter pour publier un commentaire.
À créer quelque chose comme une fonction membre, vous devez l'ajouter à la protoype de la fonction constructeur:
Aussi je vous recommande fortement de lire quelque chose à propos de la façon dont l'objet système de JavaScript qui fonctionne. Il y a un très bon article sur le sujet sur MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaScript
OriginalL'auteur ThiefMaster
Il ne fonctionne pas parce que c'est maintenant le fonctionnement de JavaScript. Juste de déclarer une fonction dans une fonction constructeur ne pas le mettre en place sur l'objet créé par la fonction de constructeur, vous avez à faire le lien entre l'objet et la fonction explicitement (directement par l'attribution à l'objet, ou plus souvent indirectement par l'intermédiaire d'un prototype).
Typique de la façon de le faire est par l'héritage par prototype, bien que vous pouvez aussi affecter des fonctions à des objets (la suite ci-dessous — mais vous avez parlé de "fonctions de membre du," et de la façon dont vous faites les choses comme ça en JavaScript est par l'intermédiaire de prototypes).
Il ya un couple de façons de configurer l'héritage par prototype. La manière classique, ce qui est compatible avec une large gamme de moteurs JavaScript, même dans les anciens navigateurs, est via le
prototype
de propriété sur les fonctions constructeur, qui renvoie à un objet. Cet objet devient le prototype des instances créées parnew FunctionName
. Vous ajoutez des propriétés de l'objet à partager entre les instances créées par cette fonction.Ainsi, l'utilisation de l'héritage par prototype:
Notes sur la ci-dessus:
En JavaScript, l'écrasante de la convention est que le constructeur fonctions commencent par une lettre majuscule. J'ai donc appelé il
Init
plutôt queinit
.Toutes les fonctions automatiquement un
prototype
de propriété sur eux, ce qui est un objet vide.- Je ajouter une propriété de l'objet appelé
displayName
qui se réfère à une fonction.Plutôt que de coder en dur le nom, je le passe en
Init
comme un argument.Remarque que je stocke le nom sur une propriété nouvellement construite d'instance; au sein de l'appel à
Init
, cette instance est disponible enthis
.De la même façon, parce que
displayName
est appelée dans le cadre d'une expression de la récupération de la fonction de référence à partir de l'objet,this
est l'objet au sein de l'appel àdisplayName
, et ainsi dethis.name
a le nom.Pour garder les choses simples ci-dessus, je me suis assigné une fonction anonyme pour
displayName
. (La propriété a un nom, la fonction ne fonctionne pas.) J'ai tendance à ne pas le faire dans le code réel.Toutes les instances construite à l'aide d'
new Init
partagent la même copie de ladisplayName
fonction, par l'intermédiaire du prototype.Pour en savoir plus (sur mon blog):
this
Vous pourriez également être intéressé par mon
de la Lignée
trousse à outils, si vous êtes intéressé par la construction de classes d'objets en JavaScript (et hiérarchies).Comme de l'ES5, il y a une autre option:
de l'Objet.créer
. Cela vous permet de créer des objets et de leur attribuer des prototypes directement, sans l'aide de fonctions constructeur. Mais comme vous avez utilisénew
, ce qui signifie que vous êtes en utilisant les fonctions constructeur, je n'entrerai pas dans le détail sur ce.Maintenant, vous n'avez pas ont à utiliser les caractéristiques du prototype de JavaScript si vous ne souhaitez pas. Vous pouvez, par exemple, faire ceci:
Qui n'utilise pas les caractéristiques du prototype de JavaScript, au lieu de cela, il crée simplement un nouveau
displayName
fonction chaque fois que vous appelezInit
et l'attribue directement à l'objet. (Toute qualité raisonnable moteur JavaScript sera assez intelligent pour réutiliser le code de la fonction, mais il y aura une fonction distincte objets pour chaque instance). Le ci-dessus a également fait l'name
propriété entièrement privée, car la fonction que nous avons créer sur chaque appel est un fermeture sur la variable localename
. (Plus: Fermetures ne sont pas compliqué)Oui, il est. Mais l'OP parle de "fonctions de membre", et le ci-dessus est typique de la façon de le faire. Je dois dire que pour le downvoter (si vous ou quelqu'un d'autre) que je pense que c'est assez dure de l'appel de la réponse ci-dessus "pas utile" (comme le downvote bouton met).
Votre post était trompeuse. "Il ne fonctionne pas parce que c'est maintenant le fonctionnement de JavaScript." En fait, vous pouvez faire quelque chose près ce que l'OP a été en train de faire, et c'est la façon de créer des variables privées. Il y a des cas à être faite pour l'utilisation de prototypes d'héritage, mais il y a aussi des cas d'être fait pour avoir des variables privées.
L'OP m'attendais à ce que juste de déclarer une fonction dans une fonction constructeur serait en quelque sorte faire une fonction membre. Ce n'est pas du fonctionnement de JavaScript, donc je l'ai dit. Ne pas induire en erreur. J'ai ajouté un non-prototype de la section de la réponse dans le cas où ils veulent pas de l'aide de prototypes, mais je remarque en attendant qu'une réponse a été acceptée -- à l'aide de prototypes.
Merci. J'ai de l'onu-bas ont voté pour vous, car vous avez ajouté que dans. Je dirai que l'un des plus floues choses à propos de JavaScript pour quelqu'un venant de C# ou Java, c'est que "cela" n'est-ce pas implicitement présent. C'est pourquoi j'ai dit que l'OP a été d'essayer de créer un membre. C'est une erreur que I exécuter régulièrement dans, et j'ai écrit JS depuis des années. Il est facile de négliger.
OriginalL'auteur T.J. Crowder
La suivante devrait fonctionner:
Oui, c'est fait. Chaque orientation de l'objet modèle de JS a ses propres avantages et inconvénients. La méthode ci-dessus est un peu plus lisible, et pourrait être utilisé si l'un/quelques occurrences de l'objet est créé. Le MDN article de @ThiefMaster a donné, c'est un bon point de départ
OriginalL'auteur janith
L'une des normes que vous pouvez utiliser est
OriginalL'auteur Kodemon
Dans votre première méthode:
fonction affichage(){} ne peut être appelé dans init(), c'est comme privé de la fonction, ne peut donc pas être utilisé comme une fonction publique de l'objet(init())
OriginalL'auteur Wang Wei Qiang