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

时间:2016-01-06 05:29:33

标签: javascript oop momentjs

我无法解决如何扩展静态函数(momentjs)以便我可以覆盖这些方法,但不会改变原始函数。

要清楚我知道如何扩展实例以覆盖函数,但是我想直接扩展库,所以我得到了自己的moment命名实例可以像momentjs一样使用。

作为一个例子,我希望能够做到以下

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

我已尝试过复制原型等的一些选项,但编辑新extendedMoment函数的原型似乎会影响原始版本。

更新:由@PatrickRoberts

回答如下

1 个答案:

答案 0 :(得分:4)

在深入研究the source之后,您无法真正直接扩展库,因为有几个未公开的作用域函数,而moment()实际上是wrapper的{ {3}} wrapper wrapper wrapper constructor。所以这里是关于通过重用相同的扩展原型而不是在工厂扩展中分配范围函数所能做到的最好的事情:

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>

这种方法的工作原理是它在工厂扩展中用Moment.prototype替换实例的原型(最初为extendedMoment.prototype),为{{1}的所有实例重用相同的toString函数}}

修改

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