如何使用 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;
}
}
要求是有一个原型函数的别名。
目前我正在这样做,即在调用时添加一个额外的函数和执行上下文,而不仅仅是一个引用:
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;
}
}