更改JavascriptCore中window.localStorage的值(从C / Obj-C API重新定义不可配置的属性)

时间:2013-12-12 15:39:46

标签: objective-c macos cocoa webkit javascriptcore

OSX中的WebKit框架有一个破坏的localStorage实现,它不会保留存储的数据(应用程序重启后数据不存在)。

所以我实现了一个替代的LocalStorage对象。

但是,我无法分配window.localStorage = myLocalStorage,因为localStorage被定义为不可写且不可配置。

我无法通过使用C / Obj-C API找到在JavascriptCore中覆盖此类属性的方法。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您不能直接覆盖它,但可以使用StorageItem覆盖它。但是,超载存储项将覆盖会话存储和localStorage

var _setItem = Storage.prototype.setItem; // first assign it to some variable
Storage.prototype.setItem = function(key, value) { 
   if (this === window.localStorage) {
     // play with localstorage here
   } else {
     // fallback
     _setItem.apply(this, arguments);
   }
}

第二种方法是覆盖__proto__属性,但这不是标准的,它在firefox,chrom,opera中得到支持不确定其他人

localStorage.__proto__ = Object.create(Storage.prototype);

检查此示例,他们已经在wriiten中覆盖默认值以存储JSON对象

https://gist.github.com/danott/942522