如何使用 es6 语法给原型函数起别名

How to alias a prototype function using es6 syntax

要求是有一个原型函数的别名。

目前我正在这样做,即在调用时添加一个额外的函数和执行上下文,而不仅仅是一个引用:

class X {
  x() {
    // stuff
  }

  y() {
    this.x();
  }
}

因为我不知道怎么做,在es5中:

function X() {

}
X.prototype.x = function () {
  // stuff
}
X.prototype.y = X.prototype.x;

可能吗?

在构造函数中添加 y 怎么样?

class X {
  constructor() {
    this.y = this.x;
  }
  x() {
    // stuff
  }
}

当然这会将它添加为一个实例属性;不过这应该不是问题,因为所有实例都只是在 y.

中持有对原型方法的引用

如果这不符合您的要求,我恳请您澄清。

以下是将其添加到原型的方法:

class X {
  x() {
    console.dir(this.__proto__);
  }
}

X.prototype.y = X.prototype.x;

(new X).x();
(new X).y();

您也可以对 类 执行相同的操作,因为它们使用相同的底层 prototype-based 结构。

所以,

class X {
  x() {
    // stuff
  }
}

X.prototype.y = X.prototype.x

工作正常。

如果你想在class中定义它,唯一的方法是你的方法:

class X {
  x() {
    // stuff
  }

  y(...args) {
    return this.x(...args);
  }
}

但是,如果 x 在子类中被重写(如果您想要 真正的别名 ,这实际上可能是您想要的),这仍然会有所不同。

有多种方法可以做到这一点。最简单的方法和没有 class 语法的一样:

X.prototype.y = X.prototype.x;

如果你坚持class语法,ES2022 will have static blocks:

class X {
    …
    static {
        // notice unlike a method definition, this creates an enumerable property
        this.prototype.y = this.prototype.x;
    }
}

如果您需要限制自己使用 ES2015,您仍然可以通过多种方式提供 x 方法作为 y

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;
    }
}