覆盖Javascript中的默认函数?

时间:2012-02-13 21:40:59

标签: javascript local-storage

问题:
我可以在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 个答案:

答案 0 :(得分: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);
};

如果不这样做,每次迭代都会产生无限循环消耗堆栈空间,导致堆栈溢出,导致浏览器崩溃:)

答案 1 :(得分:2)

或者,不是创建一个新的变量来保存旧的 Storage 函数,而是可以像这样绑定你的函数。

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

在控制台中检查时,您可以获得将新功能表示为本机代码的好处,以及更简洁的代码。

答案 2 :(得分:0)

这是正常的,你进行无限递归:在Storage.prototype.setItem中,你调用引用Storage.prototype.setItem的this.setItem。

对于Storage.prototype.getItem也一样。