una tutorial tablas tabla strip_tags remove obtener from ejemplos definicion datos con agregar javascript design-patterns oop

tutorial - Patrón de JavaScript para múltiples constructores



strip_tags javascript (7)

Necesito diferentes constructores para mis instancias. ¿Cuál es un patrón común para eso?


¿Cómo encuentras este?

function Foobar(foobar) { this.foobar = foobar; } Foobar.prototype = { foobar: null }; Foobar.fromComponents = function(foo, bar) { var foobar = foo + bar; return new this(foobar); };


A veces, los valores predeterminados para los parámetros son suficientes para múltiples constructores. Y cuando eso no es suficiente, intento envolver la mayoría de las funciones del constructor en una función init (other-params) que se llama después. También considere utilizar el concepto de fábrica para crear un objeto que pueda crear efectivamente los otros objetos que desee.

http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript


Así que sí, como se expresó anteriormente, con múltiples soluciones, lo que se ve en general en cosas como la fecha son los métodos estáticos:

Date.UTC("some params");

Aunque este no es un constructor apropiado, esto es

function someObject(a,b,c,d,e,f) { a = a || "default"; b = b || "defaultb" }

¿Puede ir mecanografiado o transpilelo a es5?

constructor(a:string, b = "default value", c:number? //optional ) { }


Este es el ejemplo dado para múltiples constructores en Programación en HTML5 con JavaScript y CSS3 - Ref . De examen .

function Book() { //just creates an empty book. } function Book(title, length, author) { this.title = title; this.Length = length; this.author = author; } Book.prototype = { ISBN: "", Length: -1, genre: "", covering: "", author: "", currentPage: 0, title: "", flipTo: function FlipToAPage(pNum) { this.currentPage = pNum; }, turnPageForward: function turnForward() { this.flipTo(this.currentPage++); }, turnPageBackward: function turnBackward() { this.flipTo(this.currentPage--); } }; var books = new Array(new Book(), new Book("First Edition", 350, "Random"));


JavaScript no tiene una función de sobrecarga, incluidos los métodos o constructores.

Si desea que una función se comporte de manera diferente según el número y los tipos de parámetros que le pase, deberá olfatearlos manualmente. JavaScript gustará llamar a una función con más o menos que el número declarado de argumentos.

function foo(a, b) { if (b===undefined) // parameter was omitted in call b= ''some default value''; if (typeof(a)===''string'') this._constructInSomeWay(a, b); else if (a instanceof MyType) this._constructInSomeOtherWay(a, b); }

También puede acceder a los arguments como una matriz para obtener cualquier otro argumento pasado.

Si necesita argumentos más complejos, puede ser una buena idea colocar algunos o todos dentro de una búsqueda de objetos:

function bar(argmap) { if (''optionalparam'' in argmap) this._constructInSomeWay(argmap.param, argmap.optionalparam); ... } bar({param: 1, optionalparam: 2})

Python demuestra cómo los argumentos predeterminados y nombrados se pueden usar para cubrir la mayoría de los casos de uso de una manera más práctica y elegante que la sobrecarga de funciones. JavaScript, no tanto.


No tenía ganas de hacerlo a mano como en la respuesta de Bobince, así que simplemente arranqué por completo el patrón de opciones del complemento de jQuery.

Aquí está el constructor:

//default constructor for Preset ''class'' function Preset(params) { var properties = $.extend({ //these are the defaults id: null, name: null, inItems: [], outItems: [], }, params); console.log(''Preset instantiated''); this.id = properties.id; this.name = properties.name; this.inItems = properties.inItems; this.outItems = properties.outItems; }

Aquí hay diferentes formas de creación de instancias:

presetNoParams = new Preset(); presetEmptyParams = new Preset({}); presetSomeParams = new Preset({id: 666, inItems:[''item_1'', ''item_2'']}); presetAllParams = new Preset({id: 666, name: ''SOpreset'', inItems: [''item_1'', ''item_2''], outItems: [''item_3'', ''item_4'']});

Y esto es lo que hizo:

presetNoParams Preset {id: null, name: null, inItems: Array[0], outItems: Array[0]} presetEmptyParams Preset {id: null, name: null, inItems: Array[0], outItems: Array[0]} presetSomeParams Preset {id: 666, name: null, inItems: Array[2], outItems: Array[0]} presetAllParams Preset {id: 666, name: "SOpreset", inItems: Array[2], outItems: Array[2]}


Yendo más allá con la respuesta de eruciform, puedes encadenar tu new llamada a tu método init .

function Foo () { this.bar = ''baz''; } Foo.prototype.init_1 = function (bar) { this.bar = bar; return this; }; Foo.prototype.init_2 = function (baz) { this.bar = ''something to do with ''+baz; return this; }; var a = new Foo().init_1(''constructor 1''); var b = new Foo().init_2(''constructor 2'');