gpt4 book ai didi

javascript - 如何在不影响原始函数的情况下在 javascript 中扩展(使用新名称)静态函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:36 24 4
gpt4 key购买 nike

我在想出如何扩展静态函数 (momentjs) 以便我可以重写这些方法时遇到问题,但又不改变原始函数。

明确地说,我知道如何扩展 moment 的 instance 来覆盖函数,但我想直接扩展库,所以我得到了我自己命名的 moment 实例> 我可以像使用 momentjs 一样使用它。

例如,我希望能够执行以下操作

extendedMoment().customFunction() //do something custom
extendedMoment().toString() //use customised toString() method
extendedMoment().format() //use the original momentjs method

我已经尝试了一些复制原型(prototype)等选项,但是编辑新的 extendedMoment 函数的原型(prototype)似乎会影响原来的原型(prototype)。

更新:@PatrickRoberts 在下面回答

最佳答案

经过深入研究 the source ,您不能真正直接扩展库,因为有几个未公开的作用域函数,并且 moment()实际上是一个 wrapperwrapperwrapperwrapperconstructor .因此,通过重用相同的扩展原型(prototype)而不是在工厂扩展中分配作用域函数,您可以做到最好:

function extendedMoment () {
return Object.setPrototypeOf(moment(), extendedMoment.prototype);
}

Object.setPrototypeOf(extendedMoment.prototype, moment.prototype);
Object.setPrototypeOf(extendedMoment, moment);

extendedMoment.prototype.toString = function toString () {
return this.format('YYYY-MM-DD');
};

console.log("Original: " + moment().toString());
console.log("Extended: " + extendedMoment().toString());
<script src="http://momentjs.com/downloads/moment.min.js"></script>

它的工作方式是在工厂扩展中用 extendedMoment.prototype 替换实例的原型(prototype)(最初是 Moment.prototype),重用相同的 extendedMoment 的所有实例的 toString 函数。

编辑

我发现自己对 extendedMoment 使用了术语“构造函数”,所以我纠正了自己。它实际上是一个工厂扩展,因为它是@ZakHenry 指出的静态函数。对用词不当表示歉意。

关于javascript - 如何在不影响原始函数的情况下在 javascript 中扩展(使用新名称)静态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34626229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com