¿Pueden las clases / objetos JavaScript tener constructores? ¿Cómo se crean?
javascript
oop
Haga clic en Upvote
fuente
fuente
Respuestas:
Usando prototipos:
Ocultar "color" (algo parecido a una variable de miembro privado):
Uso:
fuente
color
. Te sugiero que uses en gran medida por preferencia personal (protección versus simplicidad)var
hace una variable privada.this
hace una variable públicaFoo
, mientras que en el último caso sabrá que seFoo
está llamando. Muy útil para la depuración.Aquí hay una plantilla que a veces uso para comportamientos similares a OOP en JavaScript. Como puede ver, puede simular miembros privados (tanto estáticos como de instancia) utilizando cierres. Lo
new MyClass()
que devolverá es un objeto con solo las propiedades asignadas althis
objeto y en elprototype
objeto de la "clase".Me preguntaron sobre la herencia usando este patrón, así que aquí va:
Y un ejemplo para usarlo todo:
Como puede ver, las clases interactúan correctamente entre sí (comparten la identificación estática
MyClass
, elannounce
método usa elget_name
método correcto , etc.)Una cosa a tener en cuenta es la necesidad de sombrear las propiedades de instancia. En realidad, puede hacer que la
inherit
función pase por todas las propiedades de instancia (usandohasOwnProperty
) que son funciones, y agregar automáticamente unasuper_<method name>
propiedad. Esto le permitiría llamar enthis.super_get_name()
lugar de almacenarlo en un valor temporal y llamarlo enlazado usandocall
.Sin embargo, para los métodos en el prototipo no necesita preocuparse por lo anterior, si desea acceder a los métodos prototipo de la superclase, simplemente puede llamar
this.constructor.super.prototype.methodName
. Si desea que sea menos detallado, por supuesto, puede agregar propiedades de conveniencia. :)fuente
cls.prototype
parte: "compartido entre instancias" es solo para leer el valor (llamarannounce
). Si establecemyClassInstance.announce
otro valor, crea una nueva propiedad enmyClassInstance
, por lo que solo se aplica a ese objeto, no a otras instancias de la clase.MyClass.prototype.announce
Sin embargo, asignar a afectará a todas las instancias.MyClass.get_nextId()
Me parece que la mayoría de ustedes están dando ejemplos de getters y setters que no son constructores, es decir, http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
lunched-dan estaba más cerca pero el ejemplo no funcionó en jsFiddle.
Este ejemplo crea una función de constructor privado que solo se ejecuta durante la creación del objeto.
Si desea asignar propiedades públicas, entonces el constructor podría definirse como tal:
fuente
Box()
función :). Pero este ejemplo, así como los ejemplos en las otras respuestas, pueden extenderse fácilmente para aceptar parámetros.Box
función y estará listo (todavía es "privado"). "Privado" en Javascript solo significa accesible a través del alcance léxico; No es necesario asignar a los miembros. Además: este código está mal. Crea una__construct
variable global , que es bastante mala.var
debe usarse para restringir el alcance de__construct
.El objetivo de la propiedad del constructor es proporcionar alguna forma de pretender que JavaScript tiene clases. Una de las cosas que no puede hacer es cambiar el constructor de un objeto después de haberlo creado. Es complicado.
Escribí un artículo bastante completo sobre él hace unos años: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
fuente
Ejemplo aquí: http://jsfiddle.net/FZ5nC/
Prueba esta plantilla:
Debe ajustar su espacio de nombres si está definiendo una clase estática:
Clase de ejemplo:
Ejemplo de instanciación:
Las funciones de aviso se definen como AB = función A_B (). Esto es para hacer que su script sea más fácil de depurar. Abra el panel Inspeccionar elemento de Chrome, ejecute este script y expanda la traza inversa de depuración:
fuente
Este es un constructor:
Cuando tu lo hagas
MyClass
se ejecuta y se devuelve un nuevo objeto de esa clase.fuente
alert(valuePassedInAsArgument);
y esto se ejecutará una vez para cada instanciación, por lo que toda la clase es el propio constructor.new object is returned of that class
- ¿No es más como un nuevo objeto devuelto de esa función?Encontré este tutorial muy útil. Este enfoque es utilizado por la mayoría de los complementos de jQuery.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Ahora ,
fuente
klass
Este patrón me ha servido bien. Con este patrón, puede crear clases en archivos separados, cargarlos en su aplicación general "según sea necesario".
fuente
var
en el constructor (o argumento de función, o en una función similar a un constructor).Sí, puede definir un constructor dentro de una declaración de clase como esta:
fuente
Supongo que publicaré lo que hago con el cierre de JavaScript ya que nadie está usando el cierre todavía.
Comentarios y sugerencias a esta solución son bienvenidos. :)
fuente
Usando la muestra de Nick anterior, puede crear un constructor para objetos sin parámetros usando una declaración de retorno como la última declaración en su definición de objeto. Devuelva su función de constructor como se muestra a continuación y ejecutará el código en __construct cada vez que cree el objeto:
fuente
this.getColor();
en la línea de arriba,alert("Object Created.");
nada será alertado. Habrá un error como "getColor no está definido". Si desea construir para poder llamar a otros métodos en el objeto, debe definirse después de todos los demás métodos. Entonces, en lugar de llamar__construct();
a la última línea, simplemente defina la construcción allí y colóquela()
para forzarla a ejecutarse automáticamente.()
al final de la definición de construcción __ todavía resultó en el error. Tuve que llamar__construct();
a su propia línea como en el código original para evitar el error.Tal vez se ha vuelto un poco más simple, pero a continuación es lo que se me ocurrió ahora en 2017:
Al usar la clase anterior, tengo lo siguiente:
Como puede ver, el constructor toma dos parámetros y establecemos las propiedades del objeto. También modificamos el color y la forma del objeto mediante el uso de las
setter
funciones, y demostramos que su cambio se mantuvo al llamargetInfo()
después de estos cambios.Un poco tarde, pero espero que esto ayude. He probado esto con una
mocha
unidad de prueba, y está funcionando bien.fuente
Lo hacen si usa Typecript - código abierto de MicroSoft :-)
El mecanografiado le permite construcciones OO 'falsas' que se compilan en construcciones javascript. Si está comenzando un proyecto grande, puede ahorrarle mucho tiempo y alcanzar la versión 1.0 de hito.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
El código anterior se 'compila' para:
fuente
En JavaScript, el tipo de invocación define el comportamiento de la función:
func()
obj.func()
new func()
func.call()
ofunc.apply()
La función se invoca como un constructor cuando se llama utilizando el
new
operador:Cualquier instancia u objeto prototipo en JavaScript tiene una propiedad
constructor
, que se refiere a la función constructora.Consulte esta publicación sobre la propiedad del constructor.
fuente
Al usar la gran plantilla de Blixt desde arriba, descubrí que no funciona bien con la herencia de varios niveles (MyGrandChildClass extendiendo MyChildClass extendiendo MyClass): se alterna al llamar al constructor del primer padre una y otra vez. Así que aquí hay una solución simple: si necesita una herencia de varios niveles, en lugar de
this.constructor.super.call(this, surName);
usarlachainSuper(this).call(this, surName);
con la función de cadena definida de esta manera:fuente
http://www.jsoops.net/ es bastante bueno para oop en Js. Si proporciona una función y variable privada, protegida y pública, y también la característica de herencia. Código de ejemplo:
fuente
solo para ofrecer algo de variedad. ds.oop es una buena manera de declarar clases con constructores en javascript. Admite todos los tipos posibles de herencia (incluido 1 tipo que incluso c # no admite), así como las interfaces, lo cual es bueno.
fuente
Aquí necesitamos notar un punto en el script java, es un lenguaje sin clase, sin embargo, podemos lograrlo usando funciones en el script java. La forma más común de lograr esto es crear una función en el script java y usar una nueva palabra clave para crear un objeto y usar esta palabra clave para definir propiedades y métodos. A continuación se muestra el ejemplo.
fuente
En la mayoría de los casos, debe declarar de alguna manera la propiedad que necesita antes de poder llamar a un método que pasa esta información. Si no tiene que establecer inicialmente una propiedad, puede llamar a un método dentro del objeto de esta manera. Probablemente no sea la forma más bonita de hacerlo, pero aún funciona.
fuente