我的 JS 黑了,或者我没有我想象的那么好......
我想创建一个扩展 Storage
(localStorage
和 sessionStorage
)的类 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/