2011-07-17 12 views
5

Escribí el siguiente código en Javascript.Clase y alcance en Javascript

function main() 
{ 
    this.a ; 
    this.set = function() 
    { 
     a = 1; 
    } 
} 

var l = new main(); 

alert("Initial value of a is "+ l.a); 
l.set(); 
alert("after calling set() value of a is "+ l.a); 

En ambos casos me dieron un valor de tan indefinido .¿Por una no está definida, incluso después llamado Set()?

Respuesta

2

a javascript esto:

function main() 
{ 
    this.a ; 
    this.set = function() 
    { 
     a = 1; 
    } 
} 

voluntad parece

function main(); 

{ // starts unattached object literal 
    this.a ; 
    this.set = function(); 

    { // starts another unattached object literal 
     a = 1; // sets value to window.a 
    } 
} 
7

Debe consultar a con this.a.

De lo contrario, se está refiriendo a una variable local a (tenías que utilizó var, omitiendo que ha hecho una a propiedad en el objeto window, esencialmente un mundial) y no la propiedad del objeto a (this estará atado a la recién objeto creado).

jsFiddle.

+0

Derecha; cuando dices 'a = 1;' estás declarando una variable global llamada 'a'. –

+0

@JustinEthier: Saludos, lo hice más explícito :) – alex

+0

Gracias a todos. Solo soy un principiante en las clases de Javascript. Ahora entendí el alcance de las variables –

2

su "set" función no se encuentra una referencia a this:

this.a = 1; 
1

Además de las respuestas anteriores : no hay clases en Javascript, solo objetos. Puede construir cosas de clase, pero el modelo de herencia de JavaScript es prototypal. En su código, main es constructor function, del cual puede derivar instancias.

Muchas personas todavía están tratando de forzar javascript en todo tipo de patrones de OOP clásicos. Todo es perfectamente posible, pero está paralizando el lenguaje. Tómese su tiempo para ver this series of lectures

+0

+1 que todos pueden conocer. – alex

0

No puede declarar una propiedad de un objeto indefinido como lo ha hecho. Y hizo referencia a la propiedad a incorrectamente en el método case. Aquí está la corrección:

function main() { 
    this.a = null; 
    this.set = function() { 
     this.a = 1; 
    } 
} 

var l = new main(); 

alert("Initial value of a is " + l.a); 
l.set(); 
alert("after calling set() value of a is " + l.a); 
Cuestiones relacionadas