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.
esto ya pasó de moda, pero si alguien más busca jquery creando clase, revisa este plugin: http://plugins.jquery.com/project/HJS
jQuery no ofrece eso. Pero Prototype lo hace, a través de Class.create .