Tengo experiencia en Go, pero estoy completamente verde cuando se trata de Javascript. Empecé a jugar con el objetivo js/wasm de Go. Me preguntaba si es posible definir una clase JS dentro de golang. El paquete syscall/js no proporciona una forma directa de hacerlo, pero según un tutorial , una clase JS es esencialmente solo una función constructora y un prototipo. Así que intenté construir el ejemplo de juguete Rectangle del tutorial en Go:
package main import ( "syscall/js" ) // Attempt to create a simple javascript class: // // class Rectangle { // constructor(height, width) { // this.height = height; // this.width = width; // } // // // Method // area() { // return this.height * this.width; // } // } func rectangleArea(this js.Value, args []js.Value) interface{} { height := this.Get("height").Float() width := this.Get("width").Float() return height * width } func rectangleConstructor(this js.Value, args []js.Value) interface{} { this.Set("height", args[0]) this.Set("width", args[1]) return this } func main() { const name = "Rectangle" rectangle := js.FuncOf(rectangleConstructor) rectangle.Set("prototype", map[string]interface{}{ "constructor": rectangle, "area": js.FuncOf(rectangleArea), }) js.Global().Set(name, rectangle) select {} } Parece funcionar en la consola Javascript de mi navegador: puedo crear una instancia de Rectangle , extender la clase, etc. Enfriar. Lo único que me preocupa es que la comparación directa entre mi clase Rectangle y una clase Rectangle2 idéntica definida en la consola JS produce diferencias:
> Rectangle function _makeFuncWrapper() length: 0 name: "" prototype: Object { constructor: _makeFuncWrapper(), area: _makeFuncWrapper() } area: function _makeFuncWrapper() constructor: function _makeFuncWrapper() <prototype>: Object { … } <prototype>: function () > Rectangle2 class Rectangle2 { constructor(height, width) } length: 2 name: "Rectangle2" prototype: Object { … } area: function area() constructor: class Rectangle2 { constructor(height, width) } <prototype>: Object { … } <prototype>: function ()Por supuesto, todas las diferencias pueden deberse a la magia especial Go/wasm.
Para resumir, mi pregunta es: ¿lo que estoy haciendo es una forma sana y sensata de definir las clases JS desde dentro de Go? Si no, ¿hay una mejor manera?