tipos orientado objetos literales herencia constructores clases javascript jquery

orientado - prototype javascript



¿Hay una mejor manera de crear una clase orientada a objetos con jquery? (6)

¿Por qué no utilizar el OOP simple que el propio JavaScript proporciona ... mucho antes de jQuery?

var myClass = function(){}; myClass.prototype = { some_property: null, some_other_property: 0, doSomething: function(msg) { this.some_property = msg; alert(this.some_property); } };

Luego, solo crea una instancia de la clase:

var myClassObject = new myClass(); myClassObject.doSomething("Hello Worlds");

¡Sencillo!

Utilizo la función jquery extend para extender un prototipo de clase.

Por ejemplo:

MyWidget = function(name_var) { this.init(name_var); } $.extend(MyWidget.prototype, { // object variables widget_name: '''', init: function(widget_name) { // do initialization here this.widget_name = widget_name; }, doSomething: function() { // an example object method alert(''my name is ''+this.widget_name); } }); // example of using the class built above var widget1 = new MyWidget(''widget one''); widget1.doSomething();

¿Hay una mejor manera de hacer esto? ¿Existe alguna manera más clara de crear la clase anterior con solo una declaración en lugar de dos?


Encontré este sitio web impresionante para oops en javascript Here


Me gusta bastante la herencia de JavaScript simple de John Resig.

var MyWidget = Class.extend({ init: function(widget_name){ this.widget_name = widget_name; }, doSomething: function() { alert(''my name is '' + this.widget_name); } });

NB: El objeto "Clase" que se muestra arriba no está incluido en jQuery, es un fragmento de 25 líneas del propio Sr. jQuery, proporcionado en el artículo anterior.


Para resumir lo que he aprendido hasta ahora:

Aquí está la función Base que hace que Class.extend () funcione en jquery (Copiado de la herencia de JavaScript simple por John Resig):

// Inspired by base2 and Prototype (function(){ var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? //b_super/b/ : /.*/; // The base Class implementation (does nothing) this.Class = function(){}; // Create a new Class that inherits from this class Class.extend = function(prop) { var _super = this.prototype; // Instantiate a base class (but only create the instance, // don''t run the init constructor) initializing = true; var prototype = new this(); initializing = false; // Copy the properties over onto the new prototype for (var name in prop) { // Check if we''re overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn){ return function() { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-class this._super = _super[name]; // The method only need to be bound temporarily, so we // remove it when we''re done executing var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } // The dummy class constructor function Class() { // All construction is actually done in the init method if ( !initializing && this.init ) this.init.apply(this, arguments); } // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect Class.constructor = Class; // And make this class extendable Class.extend = arguments.callee; return Class; }; })();

Una vez que haya ejecutado este código, eso hace posible el siguiente código de la respuesta de Insin :

var MyWidget = Class.extend({ init: function(widget_name){ this.widget_name = widget_name; }, doSomething: function() { alert(''my name is '' + this.widget_name); } });

Esta es una buena y limpia solución. Pero estoy interesado en ver si alguien tiene una solución que no requiera agregar nada a jquery.