2012-07-31 4 views
3

Je veux créer un objet. Et, dans presque code que j'ai lu, ils utilisent souvent ce style:Javascript: différence de deux façons déclarent variable dans une fonction

function student(_id, _name, _year){ 
    this.id = _id; 
    this.name = _name; 
    this.year = _year; 
} 

Mais, je ne sais pas quelle est la différence avec le code ci-dessous:

function student (_id, _name, _year){ 
    var id = _id; 
    var name = _name; 
    var year = _year; 
} 

J'ai testé par exemple, alert propriétés à l'écran, et ne voient aucune différence.

Merci de

+2

Les caractères de soulignement dans les signatures de second paramètre manquent-ils intentionnellement? – Thilo

+0

Eh bien, le deuxième exemple ne fonctionne pas. '_id',' _name' et '_year' ne sont pas définis. – Hamish

+0

Je suis désolé. Je l'ai réparé – hqt

Répondre

3

Lorsque vous déclarez des variables à l'aide var ils ne sont visibles que dans le cadre de votre fonction/constructeur. Ils sont privés pour ainsi dire.

En utilisant ce, dans ce cas, va de pair avec une fonction constructeur. Lorsque vous instanciez un étudiant, toutes les valeurs attribuées à celui-ci seront accessibles au public.

D'abord je vous conseille de renommer votre étudiant en étudiant avec un capital S. C'est une convention qui indique qu'il s'agit d'un constructeur et que vous devez utiliser le mot-clé nouveau.

function Student(id, name, year){ 
    this.id = id; 
    this.name = name; 
    this.year = year; 
} 

Si vous instancier maintenant l'étudiant, vous pouvez accéder aux valeurs ...

var student = new Student(1, "Name", 2012); 
console.log(student.year); // => 2012 

Lorsque vous utilisez var vous ne pouvez pas ...

function Student (id, name, year){ 
    var id = id; 
    var name = name; 
    var year = year; 
} 

var student = new Student(1, "Name", 2012); 
console.log(student.year); // => undefined 
+0

Alors, pourquoi souvent quand ils utilisent 'this.property = propriété', ils font aussi' getter' bien que ses propriétés soient publiques, et plus encore, cela viole le principe OOP. Merci :) – hqt

+0

@hqt Si vous voulez restreindre la lecture et l'écriture des propriétés, vous pouvez également créer des getters et des setters à coup sûr. Vous pouvez le faire avec des fonctions standard ou dans les éditions ultérieures d'EcmaScript (JavaScript) il y a des getters et setters intégrés dans la langue. Voir la question suivante sur les getters et les setters. http://stackoverflow.com/questions/3384222/does-javascript-allow-getters-and-setters –

2

la différence est les propriétés sont publiques dans le premier tout privat dans le second.

Il n'y a pas de différence entre la variable principale avec ou sans trait de soulignement. le deuxième exemple ratant les arguments. id contre _id.

+0

Je pourrais être mal informé, mais y a-t-il une telle chose dans JS? Variables privées et publiques? N'appartiennent-ils pas seulement à des portées différentes? –

+1

@ JonasG.Drange: Les mettre dans une portée que personne d'autre ne peut voir les rend privés. – Thilo

+0

@Jonas il n'y a pas de définition en tant que telle privée et publique en JavaScript, mais nous avons tendance à les penser de la manière OOP. espérons avoir du sens. – bingjie2680

2
function student(_id, _name, _year){ 
    this.id = _id; 
    this.name = _name; 
    this.year = _year; 
} 
var s1 = new student(1, 'mike', 20); 
console.log(s1.name); // give you mike 

function student(_id, _name, _year){ 
    var id = _id; 
    var name = _name; 
    var year = _year; 
} 

var s1 = new student(1, 'mike', 20); 
console.log(s1.name); // give you undefined 
+0

Donc, pourquoi souvent quand ils utilisent this.property = propriété, ils font aussi getter bien que ses propriétés soient publiques, et plus, il est contraire au principe OOP. Thanks :) – hqt

+0

@hqt En javascript, toutes les propriétés d'un objet sont publiques. – xdazz

+0

Alors, pourquoi ils font getter, juste pour plus de commodité, non? Et voir que violer OOP – hqt

2

Son sur la portée de les variables.

Dans votre premier exemple, vous attribuez un ID, un nom et une année en tant que propriétés accessibles de l'extérieur à l'élève. Par exemple:

student.id, student.name, student.year 

Cependant, dans le second exemple, ces variables n'ont portée à l'intérieur la fonction d'étudiant. Vous ne pouvez pas accéder à leurs valeurs de l'extérieur.

Questions connexes