2012-02-13 3 views
4

Вопрос:
Могу ли я переопределить функции «по умолчанию» в Javascript?Переопределение функций по умолчанию в 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); 
}; 

ответ

10

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

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); 
}; 

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

+5

+1 переполнение стека ... не бесконечный цикл –

+0

его оба :) бесконечная рекурсия, приводящая к переполнению стека! его можно получить переполнение стека без бесконечной рекурсии: P – caleb

+0

да, это правда. но давай. это закончилось бы из-за переполнения стека. это был бесконечный цикл, он не вызвал бы ошибку JS. –

0

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

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

2

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

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

Я использовал ваш ответ, потому что похоже, что это невозможно отменить, что я и хочу. Это правда? – StarQuake

+0

Насколько мне известно, он не может. –

Смежные вопросы