繁体   English   中英

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

[英]How do I extend (with a new name) a static function in javascript without affecting the original?

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

需要明确的是,我知道如何扩展瞬间覆盖功能的一个实例 ,但我想,所以我得到了我自己的命名实例直接扩展库moment ,我可以以同样的方式作为momentjs使用。

举个例子,我希望能够做到以下几点

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

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

更新 :@PatrickRoberts在下面回答

一些挖成后 ,你真的不能直接原因有以下几种范围的功能,这不被暴露,并延长图书馆moment()实际上是包装一个的包装包装一个的包装中的构造 因此,通过重用相同的扩展原型而不是在工厂扩展中分配范围函数,可以做到最好:

 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替换实例的原型(最初是Moment.prototype ),为所有extendedMoment实例重用相同的toString函数。

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM