我有一个JS停电,或者我没有我想象的那么好......
我想创建一个Sites
扩展Storage
(localStorage
和sessionStorage
)的类。我想要那个,因为 Storage 已经命名了 items 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: Object function Storage() { [native code] } has no method 'call'
函数存储怎么不能被调用?(很公平,它没有完全暴露。)我怎样才能使用它的构造函数?
如果我Storage.call
从我的构造函数中删除,我可以创建 object sites
,但是当我尝试使用它的接口时:
var sites = new rweb.Sites;
> Sites {}
sites.setItem('foo', 'bar');
它告诉我:
TypeError:非法调用
什么??如果我console.log(sites.setItem)
能看到它真的是我的意思的功能:
函数 setItem() { [本机代码] }
我是做错了,还是他们真的暴露的不够多,Storage
无法重复使用?
顺便说一句:我可以扩展Storage
和使用它:
Storage.prototype.foo = function() {
return 'bar';
};
sites.foo(); // returns 'bar' and no errors
所以我认为原型设计工作......
我正在使用 Chrome,它都是 Chrome 扩展,所以它可以是高科技的。(听说setPrototypeOf
要来了。)