После написания статьи прошло достаточно много времени. И захотелось сделать нечто более универсальное. Для начала надо отделить наш прототип от основного скрипта. Поэтому в основной скрипт пишем:
Код
Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Components.interfaces.mozIJSSubScriptLoader)
.loadSubScript("file:///c:/path/to/file/name.js?" + Math.random());
В идеале хорошо бы выделить отдельный каталог вроде "c:\scripts" под такие вложения, поскольку ими вполне можно будет пользоваться не один раз. Случайное число прибавляется к имени для того, чтобы ФФ не складировал наш прототип в кеш и нам не требовалось бы каждый раз перезапускать браузер, при малейших изменениях. Пока ничего сложного. Теперь создаем новый файл со следующим содержимым и укладываем его по вызову:
Код
var fW = function (Name, Path) {
if (!(this instanceof fW)) {
return new fW(fileName, filePath)
} // все равно объект получите!!!
var Cc = Components.classes;
var Ci = Components.interfaces;
this.fileName = Name;
this.filePath = Path;
this.file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
this.file.initWithPath(this.filePath);
this.file.appendRelativePath(this.fileName);
};
fW.prototype.readFileAll = function(){
this.stream = Cc["@mozilla.org/network/file-input-stream;1"]
.createInstance(Ci.nsIFileInputStream);
this.stream.init(this.file,0x01, 00004, null);
this.streamSize = Cc["@mozilla.org/scriptableinputstream;1"]
.createInstance(Ci.nsIScriptableInputStream);
this.streamSize.init(this.stream);
return this.streamSize.read( this.streamSize.available() );
}
На данный момент наш "классик" состоит из конструктора, который инициализирует основные переменные и одного прототипа функции, которая читает содержимое файла. Полностью. Прототипом мы добиваемся того, что при создании нескольких объектов, с помощью данного конструктора, функции не копируются в сам объект, а остаются в единственном экземпляре, и разделяются нашими объектами.
Ну и главное, как же этим всем пользоваться. Все достаточно просто. Вот пример загрузки содержимого файла в переменную:
Код
var file = new fW("my_file.txt", "c:\\path\\to\\my\\file\\here");
var contents = file.readFileAll();
Мы просто создаем объект. При начальной инициализации переменная file привязывается к нашему файлу. Если потребуется считать из другого файла - надо создать новый объект. Но можно впоследствии создать прототип функции, которая поменяет свойства объекта на требуемые. Это на будущее...