Переопределение функций по умолчанию в Javascript? - PullRequest
4 голосов
/ 14 февраля 2012

Вопрос:
Могу ли я переопределить функции «по умолчанию» в Javascript?

Справка:
Узнав, что у меня есть коллизии между объектами, хранящимися в localStorage, я решил, что должен применить префикс ко всем ключам, чтобы избежать коллизий. Очевидно, что я мог бы создать функцию-обертку, но было бы намного лучше переопределить значение по умолчанию localStorage.getItem & localStorage.setItem напрямую, чтобы учесть мой префикс.

Мой пример полностью убивает Firefox, поскольку он рекурсивно называет себя, поэтому он явно не близок к решению. Возможно, это проясняет то, чего я хочу достичь.

Код:

Storage.prototype.setItem = function(key, value) {
    this.setItem("prefix"+key, value);
};

Storage.prototype.getItem = function(key, value) {
    return this.getItem("prefix"+key);
};

Ответы [ 3 ]

10 голосов
/ 14 февраля 2012

Вам нужно сохранить старую функцию.

Storage.prototype._setItem = Storage.prototype.setItem;
Storage.prototype.setItem = function(key, value) {
    this._setItem("prefix" + key, value);
};

Storage.prototype._getItem = Storage.prototype.getItem;
Storage.prototype.getItem = function(key) {
    return this._getItem("prefix" + key);
};

Если нет, вы получаете бесконечный цикл, потребляющий пространство стека на каждой итерации, что приводит к переполнению стека, что приводит к сбою вашего браузера:)

2 голосов
/ 24 декабря 2012

Кроме того, вместо создания новых переменных для хранения старых функций Хранилище вы всегда можете связать свои функции следующим образом.

Storage.prototype.setItem = (function(key, value) {
    this.call(localStorage,"prefix" + key, value);
}).bind(Storage.prototype.setItem);

Storage.prototype.getItem = (function(key) {
    return this.call(localStorage,"prefix" + key);
}).bind(Storage.prototype.getItem);

И вы получаете преимущества представления своих новых функций в виде собственного кода при проверке в консоли, а также в виде менее загроможденного кода.

0 голосов
/ 14 февраля 2012

Это нормально, вы делаете бесконечную рекурсию: в Storage.prototype.setItem вы вызываете this.setItem, который ссылается на Storage.prototype.setItem.

То же самое для Storage.prototype.getItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...