Alcance de objetos ECMAScript
- Página anterior Tipo de objeto
- Página siguiente Definir una clase o objeto
El ámbito se refiere al rango de aplicación de las variables.
Alcance público, privado y protegido
Concepto
En la programación orientada a objetos tradicional, se presta atención principalmente a los alcances públicos y privados. Las propiedades del ámbito público pueden ser accedidas desde el exterior del objeto, es decir, después de que el desarrollador crea una instancia del objeto, puede usar sus propiedades públicas. Las propiedades del ámbito privado solo pueden ser accedidas internamente, es decir, para el mundo exterior, estas propiedades no existen. Esto significa que si una clase define propiedades y métodos privados, sus subclases no pueden acceder a estas propiedades y métodos.
El ámbito protegido también se utiliza para definir propiedades y métodos privados, pero estos pueden ser accedidos por las subclases.
ECMAScript solo tiene ámbito público
Discutir estos alcances en ECMAScript es prácticamente inútil, porque en ECMAScript solo existe un ámbito: el ámbito público. Todas las propiedades y métodos de todos los objetos en ECMAScript son públicos. Por lo tanto, al definir sus propias clases y objetos, debe ser muy cuidadoso. Recuerde, todas las propiedades y métodos son públicas por defecto!
Solución sugerida
Muchos desarrolladores han propuesto patrones efectivos de ámbito de propiedades en línea, que resuelven este problema en ECMAScript.
Dado que falta el ámbito privado, los desarrolladores han establecido una convención que indica qué propiedades y métodos deben considerarse privados. Esta convención prescribe agregar subrayados antes y después de las propiedades:
obj._color_ = "blue";
En este código, la propiedad color es privada. Tenga en cuenta que el subrayado no cambia el hecho de que la propiedad es una propiedad pública, sino que solo informa a otros desarrolladores que deben considerar esta propiedad como privada.
Algunos desarrolladores también prefieren usar subrayado para indicar miembros privados, por ejemplo: obj._color.
Acerca del ámbito estático
Las propiedades y métodos definidos en el ámbito estático se pueden acceder desde el mismo lugar en cualquier momento. En Java, las clases pueden tener propiedades y métodos sin necesidad de instanciar el objeto de la clase, por ejemplo, la clase java.net.URLEncoder, su función encode() es un método estático.
ECMAScript no tiene ámbito estático
Estrictamente hablando, ECMAScript no tiene ámbito estático. Sin embargo, puede proporcionar propiedades y métodos a los constructores. ¿Te acuerdas? Los constructores son funciones. Las funciones son objetos, y los objetos pueden tener propiedades y métodos. Por ejemplo:
function sayHello() { alert("hello"); } sayHello.alternate = function() { alert("hi"); } sayHello(); // salida "hello" sayHello.alternate(); // salida "hi"
Aquí, el método alternate() es realmente un método de la función sayHello. Puede llamar a sayHello() como una función común para salida "hello", o llamar a sayHello.alternate() para salida "hi". Incluso así, alternate() es un método del ámbito público de sayHello(), no un método estático.
Palabra clave this
Función de this
Uno de los conceptos más importantes que hay que aprender en ECMAScript es el uso de la palabra clave this, que se usa en los métodos del objeto. La palabra clave this siempre se refiere al objeto que llama al método, por ejemplo:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(this.color); }; oCar.showColor(); // salida "red"
En el código anterior, la palabra clave this se usa en el método showColor() del objeto. En este entorno, this es igual a oCar. El siguiente código tiene la misma función que el anterior:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(oCar.color); }; oCar.showColor(); // salida "red"
Razones para usar this
¿Por qué usar this? Porque al instanciar un objeto, siempre es incierto el nombre de variable que usará el desarrollador. Al usar this, se puede reutilizar la misma función en múltiples lugares. Piensa en el siguiente ejemplo:
function showColor() { alert(this.color); }; var oCar1 = new Object; oCar1.color = "red"; oCar1.showColor = showColor; var oCar2 = new Object; oCar2.color = "blue"; oCar2.showColor = showColor; oCar1.showColor(); //Salida "red" oCar2.showColor(); //Salida "blue"
En el código anterior, primero se define la función showColor() con this, luego se crean dos objetos (oCar1 y oCar2), uno de los cuales tiene la propiedad color configurada como "red", y el otro tiene la propiedad color configurada como "blue". Ambos objetos tienen la propiedad showColor, que apunta a la función showColor () original (no hay problemas de nombre aquí, ya que uno es una función global y el otro es una propiedad del objeto). Al llamar a showColor() de cada objeto, la salida de oCar1 es "red", y la salida de oCar2 es "blue". Esto se debe a que al llamar a oCar1.showColor(), la palabra clave this en la función es igual a oCar1. Al llamar a oCar2.showColor(), la palabra clave this en la función es igual a oCar2.
Nota: al referirse a las propiedades del objeto, es necesario usar la palabra clave this. Por ejemplo, si se usa el siguiente código, el método showColor() no se puede ejecutar:
function showColor() { alert(color); };
Si no se usa el objeto o la palabra clave this para referirse a la variable, ECMAScript lo considerará una variable local o global. Luego, la función buscará una variable local o global llamada color, pero no la encontrará. ¿Qué resultado obtendrá? La función mostrará "null" en la advertencia.
- Página anterior Tipo de objeto
- Página siguiente Definir una clase o objeto