jump to navigation

Orientación a Objetos en JavaScript Miércoles, 11 febrero 2009

Posted by israelof in Implementación.
add a comment

Aunque el título de este post pueda indicar que vamos a hablar de cómo implementar toda la metodología de Orientación a Objetos en JavaScript, no es así. Ya existe multitud de lugares donde hay gran cantidad de literatura que hablan de este tema.

Lo que pretendemos, es mostrar el modo que hemos utilizado nosotros para implementar la orientación a objetos, y es que, si buscáis un poco, veréis como existen diferentes formas de llavarlo a cabo.

El siguiente código, a modo de ejemplo, muestra bastante bien como lo hemos implementado:

Clase_A = function() {
	//Atributos
	this.atributo_publico = "atributo_publico";
	var atributo_privado = "atributo_privado";

	//Métodos
	this.metodo_publico_1 = function() {
		alert(atributo_privado);
	}
	this.metodo_publico_2 = function() {
		metodo_privado_1();
	}
	this.metodo_publico_3 = function() {
		var objeto_b = new Clase_B();
		objeto_b.metodo_publico_1("Llamada a método publico de otro objeto");
	}
	metodo_privado_1 = function() {
		alert("metodo_privado_1");
	}
}

Clase_B = function() {
	//Metodos
	this.metodo_publico_1 = function(txt) {
		alert(txt);
	}
}

objeto_a = new Clase_A();
alert(objeto_a.atributo_publico);
alert(objeto_a.atributo_privado);	//Undefined
objeto_a.metodo_publico_1();
objeto_a.metodo_publico_2();
objeto_a.metodo_publico_3();
objeto_a.metodo_privado_1();		//Error

La idea de utilizar esta forma de sintaxis para la implementación, es para conseguir que se parezca lo más posible a otros lenguajes de Orientacion a Objetos, se pretende que la lectura del código sea la más similar y sencilla posible.

Anuncios

Copiar y pegar Miércoles, 4 febrero 2009

Posted by israelof in Implementación.
1 comment so far

Después de unas largas vacaciones de playa y montaña, tocaba volver a escribir en el blog, y esta vez, con uno de los post que denominamos “duros” y es que hoy toca hablar de implementación.

Vamos a hablar de cómo desarrollar las funciones de copiar y pegar. Para ello vamos a mostrar el código javascript de las funciones que hemos implementado para realizar estos cometidos.

Función para copiar:

function copy(txt) {
   if (window.clipboardData) {
      window.clipboardData.clearData();
      window.clipboardData.setData("Text", txt);
   }
   else if (window.netscape) {
      try {
         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      }
      catch (e) {
         alert("Unprivileged scripts cannot access Cut/Copy/Paste programatically for security reasons.\n"+
                "You need set 'signed.applets.codebase_principal_support=true' at about:config'");
         return false;
      }
      var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
      if (!clip)
         return;
      var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
      if (!trans)
         return;
      trans.addDataFlavor('text/unicode');
      var str = new Object();
      var len = new Object();
      var str = Components.classes['@mozilla.org/supports-tring;1'].createInstance(Components.interfaces.nsISupportsString);
      var copytext = txt;
      str.data = copytext;
      trans.setTransferData("text/unicode",str,copytext.length*2);
      var clipid = Components.interfaces.nsIClipboard;
      if (!clip)
         return false;
      clip.setData(trans,null,clipid.kGlobalClipboard);
   }
}

Función para pegar:

function paste() {
   if(window.clipboardData) {
      txt = window.clipboardData.getData('Text');
      return txt;
   }
   else if (window.netscape) {
      try {
         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      }
      catch (e) {
         alert("Unprivileged scripts cannot access Cut/Copy/Paste programatically for security reasons.\n"+
                "You need set 'signed.applets.codebase_principal_support=true' at about:config'");
         return false;
      }
      var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard);
      if (!clip)
         return false;
      var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
      if (!trans)
         return false;
      trans.addDataFlavor("text/unicode");
      clip.getData(trans, clip.kGlobalClipboard);
      var str = new Object();
      var strLength = new Object();
      trans.getTransferData("text/unicode", str, strLength);
      if (str)
         str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
      if (str)
         pastetext = str.data.substring(0, strLength.value / 2);
      txt = pastetext;
      return txt;
   }
}

Como podemos ver, en Internet Explorer a penas existen impedimentos de seguridad para poder acceder al portapapeles. Cuando ejecutemos estas funciones, el navegador nos preguntará si permitimos el acceso al portapeles y nada más.

En cambio, en Firefox la seguridad está más controlada y deberemos modificar la propia configuracion del navegador, si queremos permitir la acción de estas funciones. Aún así, cada vez que las ejecutemos nos preguntará si estamos realmente seguros de que queremos realizar esa acción. Queda así patente que los chicos de Mozilla han apostado por la seguridad.