使用不同的名称向Javascript类添加相同的函数两次

使用不同的名称向Javascript类添加相同的函数两次,javascript,ecmascript-6,Javascript,Ecmascript 6,我想用两个不同的函数名向Javascript类添加两次相同的函数 到目前为止,我已经提出了两种实现方法 使用其他名称向原型添加函数: 添加两个函数。从第二个呼叫第一个: 第一种解决方案不是简单的类语法,第二种解决方案也可以,但我宁愿让jsut调用一个函数,而不是嵌套的函数。另外,如果原始函数中的参数数量发生变化,则我的第二个解决方案可能更难维护 有更好的办法解决我的小问题吗 其动机是我正在实现一个解析器,其中不同的规范对同一数据类型使用不同的名称(uint16、ushort、card16)。因此

我想用两个不同的函数名向Javascript类添加两次相同的函数

到目前为止,我已经提出了两种实现方法

  • 使用其他名称向原型添加函数:
  • 添加两个函数。从第二个呼叫第一个:
  • 第一种解决方案不是简单的类语法,第二种解决方案也可以,但我宁愿让jsut调用一个函数,而不是嵌套的函数。另外,如果原始函数中的参数数量发生变化,则我的第二个解决方案可能更难维护

    有更好的办法解决我的小问题吗


    其动机是我正在实现一个解析器,其中不同的规范对同一数据类型使用不同的名称(uint16、ushort、card16)。因此,为处理这些数据类型使用替代函数名将更容易遵循不同的规范。

    第一种方法在
    声明之后为第二个方法的
    原型
    对象添加第二个属性没有错。或者,如果您希望新方法的
    可枚举
    标志与原始方法一样为

    Object.defineProperty(MyClass.prototype, "computeM", {
        value: MyClass.prototype.computeN,
        writable: true,
        configurable: true,
        // (The default for `enumerable` is `false`)
    });
    
    但如果不想这样做,可以使用实例属性:

    class MyClass {
        computeN() {
          // do some computation here
        }
        computeM = this.computeN;
    }
    
    这是使用的,它在大多数主要的JavaScript引擎中都实现了,很快就会出现在规范中。如果你不想依赖它:

    class MyClass {
        constructor() {
            this.computeM = this.computeN;
        }
        computeN() {
          // do some computation here
        }
    }
    
    它们都创建了一个可枚举属性。如果希望它是不可枚举的:

    class MyClass {
        constructor() {
            Object.defineProperty(this, "computeM", {
                value: this.computeN,
                writable: true,
                configurable: true,
                // (The default for `enumerable` is `false`)
            });
        }
        computeN() {
          // do some computation here
        }
    }
    

    谢谢,你的第一个解决方案就是我想要的。我也有同样的想法,但JSFIDLE将此标记为错误,所以我在实验期间甚至没有尝试运行它。@Waruyama-不用担心(这是我现在的第二个解决方案,我的第一个解决方案只是对您最初分配给
    .prototype.computeM
    )FWIW的一个改进,该解决方案创建了一个自己的可枚举属性,所以这和computeN不太一样,但这不太重要。
    class MyClass {
        constructor() {
            this.computeM = this.computeN;
        }
        computeN() {
          // do some computation here
        }
    }
    
    class MyClass {
        constructor() {
            Object.defineProperty(this, "computeM", {
                value: this.computeN,
                writable: true,
                configurable: true,
                // (The default for `enumerable` is `false`)
            });
        }
        computeN() {
          // do some computation here
        }
    }