3

我正在使用Date.js在我的网络应用程序中支持多种文化。这里的问题是 date.js 有这样的代码。

  Date.prototype._toString = Date.prototype.toString;
  Date.prototype.toString = function () {
    //doing something
        return this._toString();
   }

当我使用另一个文化文件时,它也包含这个定义。所以逻辑上我的医生有这个

//date.js
     Date.prototype._toString = Date.prototype.toString;
     Date.prototype.toString = function () {
     //doing something
         return this._toString();
     }
     //date-fr-FR.js
     Date.prototype._toString = Date.prototype.toString;
     Date.prototype.toString = function () {
         //doing something
         return this._toString();
     }

我在我的网络应用程序中同时引用 date.js 和 date-fr-FR.js。

问题是当我使用 toString 函数var d = new Date().toString();时,它会抛出一个Out of stack spacemsg,因为递归调用。有没有办法缓存原始 Date 对象并将其恢复,因为我不想从文档中删除 date.js

4

3 回答 3

2

无需同时包含date.jsand date-fr-FR.js,您只需包含fr-FR.js文件即可更改文化,您可以在 Datejs-all-Alpha1.zip 文件的 src/globalization 文件夹中找到该文件。fr-FR.js 文件仅包含特定于文化的数据,它应该覆盖 date.js 中已包含的内容,而不重新定义功能。

于 2012-11-01T08:55:05.983 回答
1

您所要做的就是检查是否_toString已定义。

Date.prototype._toString = Date.prototype._toString || Date.prototype.toString;
Date.prototype.toString = function() {
    //doing something      
    return this._toString();
}
于 2012-11-01T09:23:16.607 回答
0

您应该只复制一次函数:

Date.prototype._toString = Date.prototype.toString;

第二次执行此操作时,它将再次复制本机 toString 函数,然后将通过递归循环调用自身。

我不知道您是否实际上不止一次这样做,但在fr-FR.js文件中没有定义其他 toString 方法,所以我猜您是手动添加它。

更新

如果您包含 date.js 核心两次(您不应该,只包含语言环境),您可能首先检查该函数是否存在:

if ( typeof Date.prototype._toString != 'function' ) {
    // include date.js
}
于 2012-11-01T08:35:39.253 回答