使用proto创建一个Storage子类

Create a Storage subclass with proto

本文关键字:一个 Storage 子类 proto 创建 使用      更新时间:2023-09-26

我的JS被屏蔽了,或者我没有想象的那么好。。。

我想创建一个扩展StoragelocalStoragesessionStorage)的类Sites。我之所以想要它,是因为存储已将项命名为AND .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(){[本机代码]}没有方法"call"

函数Storage怎么可能不可调用?(很公平,它还没有完全公开。)我如何使用它的构造函数?

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

var sites = new rweb.Sites;
> Sites {}
sites.setItem('foo', 'bar');

它告诉我:

TypeError:非法调用

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

函数setItem(){〔本机代码〕}

我做得完全错了吗?还是他们真的没有暴露足够的Storage使其可重复使用?

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

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

所以我认为原型设计是可行的。。。

我正在使用Chrome,它将是Chrome的扩展,所以它可以是高科技的。(我听说有setPrototypeOf要来了。)

Storage未完全公开且不可扩展。

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