使用proto创建一个Storage子类

时间:2013-07-28 20:44:55

标签: javascript class prototype

我有一个JS黑掉,或者我不如我想的那么好......

我想创建一个扩展SitesStoragelocalStorage)的班级sessionStorage。我想要,因为存储已命名项目和.length。完美的我想要的。

所以我这样做了(它在rweb中命名为:)

rweb.Sites = function Sites() {
   // There might be something useful in Storage's constructor?
  Storage.call(this);
  this.STORAGE = 'sync';
};
rweb.Sites.prototype = Object.create(Storage.prototype);
rweb.Sites.prototype.constructor = rweb.Sites;

我认为这就是我通常做JS类的方法......:创建构造函数,为其分配其他原型,覆盖构造函数。

我重写构造函数,以便:

var sites = new rweb.Sites;
sites.constructor == rweb.Sites;
> true

在新构造函数中失败:

  

TypeError:对象函数Storage(){[native code]}没有方法'call'

功能存储如何无法调用? (很公平,它没有完全暴露。)我如何使用它的构造函数?

如果我从构造函数中删除Storage.call,我可以创建对象sites,但是当我尝试使用它的界面时:

var sites = new rweb.Sites;
> Sites {}
sites.setItem('foo', 'bar');
它告诉我:

  

TypeError:非法调用

什么?如果我console.log(sites.setItem)我可以看到它真的是我的意思:

  

function setItem(){[native code]}

我是完全错误还是他们真的没有暴露Storage足以让它重复使用?

BTW:我可以扩展Storage并使用它:

Storage.prototype.foo = function() {
  return 'bar';
};
sites.foo(); // returns 'bar' and no errors

所以我认为原型制作工作......

我正在使用Chrome,它将全部是Chrome扩展程序,因此它可以是高科技。 (我听说有setPrototypeOf来了。)

1 个答案:

答案 0 :(得分:0)

Storage未完全曝光且无法扩展。

里面可能有太多危险的魔法。