javascript - 使用 proto 创建一个 Storage 子类

标签 javascript class prototype

我的 JS 黑了,或者我没有我想象的那么好......

我想创建一个扩展 Storage(localStoragesessionStorage)的类 Sites。我想要那个,因为 Storage 已命名项目和 .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 类的方式......:创建构造函数,为其分配其他原型(prototype),覆盖构造函数。

我覆盖了构造函数,因此:

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

它在新的构造函数中失败了:

TypeError: Object function Storage() { [native code] } has no method 'call'

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

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

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

它告诉我:

TypeError: Illegal invocation

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

function setItem() { [native code] }

我做的是完全错误的还是他们真的没有公开足够的 Storage 以使其可重用?

顺便说一句:我可以扩展 Storage 并使用它:

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

所以我认为原型(prototype)设计工作...

我使用的是 Chrome,它都是 Chrome 的扩展,所以它可以是高科技的。 (我听说有一个 setPrototypeOf 来了。)

最佳答案

存储 未完全公开且不可扩展。

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

关于javascript - 使用 proto 创建一个 Storage 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912703/

相关文章:

python - 在类中定义装饰器,在类定义中也可用

C++:类之间的 "unresolved overload function type"

javascript - 如何告诉WebStorm解析继承的方法?

javascript - 测试回调在哪个函数中执行

javascript - 文档点击隐藏菜单

javascript - 如何在超过一定宽度阈值时刷新页面?

javascript - Bootstrap 日期选择器 : Misaligned

javascript - react : CSS breaks using classList in IE and Edge

c++ - 从另一个类调用另一个类的函数

javascript - 在 Framer.js 中打印滚动位置