El requisito es tener un alias para una función prototipo.
Actualmente estoy haciendo esto, que agrega una función adicional y un contexto de ejecución, cuando se llama, en lugar de solo una referencia:
class X { x() { // stuff } y() { this.x(); } }Porque no sé cómo hacer esto, en es5:
function X() { } X.prototype.x = function () { // stuff } X.prototype.y = X.prototype.x;¿Es posible?
Hay varias maneras de hacer esto. Lo más fácil es hacer lo mismo que sin la sintaxis de class :
X.prototype.y = X.prototype.x; Si insiste en la sintaxis de class , ES2022 tendrá bloques estáticos :
class X { … static { // notice unlike a method definition, this creates an enumerable property this.prototype.y = this.prototype.x; } } Si necesita limitarse a ES2015, aún puede proporcionar el método x como y de varias maneras:
class X { … constructor() { // notice this creates an own, enumerable property this.y = this.x; } } class X { … // notice this prevents assignments to `.y` get y() { return this.x; } }También puede hacer lo mismo con las clases, porque utilizan la misma estructura subyacente basada en prototipos.
Asi que,
class X { x() { // stuff } } X.prototype.y = X.prototype.xfunciona bien.
Si desea definirlo en la class , la única forma es su enfoque:
class X { x() { // stuff } y(...args) { return this.x(...args); } } Sin embargo, esto aún se comportará de manera diferente si x se anula en una subclase (que en realidad podría ser lo que desea, si desea un alias verdadero ).
¿Qué tal si agregas y en el constructor?
class X { constructor() { this.y = this.x; } x() { // stuff } } Por supuesto, esto lo agregará como una propiedad de instancia; Sin embargo, esto no debería ser un problema porque todas las instancias simplemente tienen una referencia al método prototipo en su y .
Si eso no cumple con sus requisitos, le pido una aclaración.
Así es como se agrega al prototipo:
class X { x() { console.dir(this.__proto__); } } X.prototype.y = X.prototype.x; (new X).x(); (new X).y();