3

JSブラックアウトしたり、思ったより上手くいかなかったり…

(と)Sitesを拡張するクラスを作成したい。Storage には AND という名前のアイテムがあるため、それが必要です。私が欲しいものにぴったりです。StoragelocalStoragesessionStorage.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.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 に答える