3

我有一个JS停电,或者我没有我想象的那么好......

我想创建一个Sites扩展StoragelocalStoragesessionStorage)的类。我想要那个,因为 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要来了。)

4

1 回答 1

1

Storage没有完全暴露并且不可扩展。

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

于 2013-11-04T18:29:33.533 回答