― MozillaZine.jp フォーラムは Mozilla 製品に関する情報交換の場です ―



All times are UTC + 9 hours

新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年4月21日(火) 11:56 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
 私は拡張を作る場合、普通に browser.xul に対して hogeoverlay.xul というファイルでオーバレイしています。
 ただその際、 hogeoverlay.xul で hogeoverlay.js というスクリプトを実行する時に、スクリプト内でグローバルオブジェクトを使用せざるを得ない場合がほとんどです。
 こういった場合、Firefox 本体や他の拡張とのオブジェクト名のコンフリクトを避けるいい方法はないでしょうか。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年4月21日(火) 13:09 
オフライン
Moderator

登録日時: 2007年5月03日(木) 01:11
記事: 91
お住まい: 東京
自分がよくやるのはこんな感じのやり方です。

コード:
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 ...
})();


これだと名前空間は関数の中だけで隔離されますし、外から変数にアクセスすることもできません。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年4月21日(火) 14:00 
オフライン

登録日時: 2007年7月01日(日) 23:02
記事: 23
お住まい: 千葉
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;
})();

外部からアクセスされる必要のあるもの、されても良いものをグローバルな部分に、そうでないものをプライベートな部分にと分けて書くようにしています。
こうすることで外部に迷惑をかけないで自由に関数を定義できます。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年4月21日(火) 15:34 
オフライン

登録日時: 2005年8月02日(火) 22:12
記事: 42
お住まい: 東京都
自分ではまだ実行してませんが(をぃ
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.

とおっしゃってますが(^^;


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年4月22日(水) 10:13 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
 みなさん、ご教示ありがとうございました。これからどの方式を採用するか検討します。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 

All times are UTC + 9 hours


オンラインデータ

このフォーラムを閲覧中のユーザー: Google Feedfetcher & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by MozillaZine.jp® Forum Software © phpBB Group , Almsamim WYSIWYG
Japanese translation principally by ocean