2016-06-30 5 views
0

Просьба не отмечать ее как повторяющуюся. Я много искал, и здесь нет такого вопроса. Есть похожие, но не то же самое.Функция переопределения Date.prototype.xyz

Я попытался, а также огляделся, чтобы найти решение для этого, но, наконец, я подумал, я должен спросить его здесь.

Без параметра

> new Date().toLocaleString()

"6/30/2016, 11:33:19 PM"

С параметром, "zh-Hans-CN" может иметь любое действительное значение, только ради вопроса.

> new Date().toLocaleString("zh-Hans-CN")

"2016/6/30 下午11:33:48"

Я действительно хочу, чтобы изменить поведение этой функции таким образом, что он должен вернуть выход, как во втором случае, но без какого-либо входного аргумента. как

> new Date().toLocaleString()

"2016/6/30 下午11:33:48"

Так что идея была, как-то переопределить эту функцию и вызвать существующую функцию внутри переопределения функции с парами.

как

Date.prototype.toLocaleString = function() { 
    return this.toLocalString("zh-Hans-CN"); 
} 

Но это неправильно, потому что эта функция вызывает себя, что приводит к бесконечной recurrsion Обсадные эту ошибку.

Uncaught RangeError: Maximum call stack size exceeded(…)

Так что это один из примеров, вопрос в том, как мы можем переопределить эту функциональность, используя ту же функцию прототипа. Возможно, есть способ сначала отделить фактическую функцию, а затем переопределить ее. Ваша помощь будет оценена по достоинству.

ответ

1

Вы можете использовать анонимную функцию для сохранения Date.prototype.toLocaleString в качестве ссылки, а затем вернуть функцию, которая возвращает reference, который связывается с этим контекстом функции.

Date.prototype.toLocaleString = (function (ref) { 
 
    return function(){ 
 
    return ref.bind(this)('zh-Hans-CN'); 
 
    } 
 

 
})(Date.prototype.toLocaleString)

+0

Это потрясающе. Будет здорово, если ты сможешь бросить какой-то свет, он работает. Я знаю, что вы уже объяснили, но если его можно улучшить. большое спасибо –