MozillaZine.jp フォーラム https://forums.mozillazine.jp/ |
|
拡張のJavaScriptの変数のスコープを限定的にしたい。 https://forums.mozillazine.jp/viewtopic.php?f=26&t=8415 |
ページ 1 / 1 |
作成者: | mitsugu [ 2009年4月21日(火) 11:56 ] |
記事の件名: | 拡張のJavaScriptの変数のスコープを限定的にしたい。 |
私は拡張を作る場合、普通に browser.xul に対して hogeoverlay.xul というファイルでオーバレイしています。 ただその際、 hogeoverlay.xul で hogeoverlay.js というスクリプトを実行する時に、スクリプト内でグローバルオブジェクトを使用せざるを得ない場合がほとんどです。 こういった場合、Firefox 本体や他の拡張とのオブジェクト名のコンフリクトを避けるいい方法はないでしょうか。 |
作成者: | Piro [ 2009年4月21日(火) 13:09 ] |
記事の件名: | Re: 拡張のJavaScriptの変数のスコープを限定的にしたい。 |
自分がよくやるのはこんな感じのやり方です。 コード: var MyAddonService = { handleEvent : function(aEvent) { switch (aEvent.type) { case 'load': this.init(); return; case 'unload': this.destroy(); return; ... } }, init : function() { }, destroy : function() { }, ... }; window.addEventListener('load', MyAddonService, false); 定数にしておきたい物や、関数は、全部このオブジェクトのプロパティやメソッドにしておくというパターンです。グローバル変数を最低一つは使用することになりますが、アドオン名にちなんだ名前にしておけば、まあ、衝突の可能性は避けられるんじゃないかなあと…… また、こうしておくと他のアドオン(自作、他の人の物を問わず)から必要に応じてメソッドを呼び出したり機能を置き換えたりできるので、連携を取りやすいというメリットもあると思っています。 コード: window['www.example.com'].foo = ... のような形でより厳密に名前空間を分ける人もいるようですけど、そこまで行くとちょっと冗長すぎるような気もするので、自分はあまり使わないです。他のアドオンから一切のアクセスを禁止するのであれば、こういう書き方でもいいんですけどね。 コード: (function() {
var ... const ... function ... })(); これだと名前空間は関数の中だけで隔離されますし、外から変数にアクセスすることもできません。 |
作成者: | teramako [ 2009年4月21日(火) 14:00 ] |
記事の件名: | Re: 拡張のJavaScriptの変数のスコープを限定的にしたい。 |
Piro さんが書きました: 他のアドオンから一切のアクセスを禁止するのであれば、こういう書き方でもいいんですけどね。 コード: (function() { var ... const ... function ... })(); これだと名前空間は関数の中だけで隔離されますし、外から変数にアクセスすることもできません。 似たようなやり方ですが、私の場合は以下のようにする事が多いです。 コード: var obj = (function(){
// private section const hogeService = Cc["@hoge/service;1"].getService(Ci.nsIHogeService); function hogehoge(){ // ... } // global section var self = { hoge: function(){ }, foo: function(){ } }; return self; })(); 外部からアクセスされる必要のあるもの、されても良いものをグローバルな部分に、そうでないものをプライベートな部分にと分けて書くようにしています。 こうすることで外部に迷惑をかけないで自由に関数を定義できます。 |
作成者: | georgei [ 2009年4月21日(火) 15:34 ] |
記事の件名: | Re: 拡張のJavaScriptの変数のスコープを限定的にしたい。 |
自分ではまだ実行してませんが(をぃ Mozilla Add-ons Blog の Successfully Getting your Addon Reviewed でリンクされている文書が、Mark A. Ziesemer: Respecting the JavaScript global namespace です。 コード: if(!com) var com={};
if(!com.ziesemer) com.ziesemer={}; if(!com.ziesemer.myPackage) com.ziesemer.myPackage={}; com.ziesemer.myPackage = { name: 'visitor', location: 'someplace unknown', alertHello: function(){ alert('Hello, ' + this.name + ", from " + this.location + '!'); } } Adblock Plus の Wladimir Palant さんは、Avoiding naming conflicts in overlays で、 引用: Unfortunately, I think that these fake namespaces are an awkward and unnatural construct in JavaScript.
とおっしゃってますが(^^; |
作成者: | mitsugu [ 2009年4月22日(水) 10:13 ] |
記事の件名: | Re: 拡張のJavaScriptの変数のスコープを限定的にしたい。 |
みなさん、ご教示ありがとうございました。これからどの方式を採用するか検討します。 |
ページ 1 / 1 | All times are UTC + 9 hours |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |