#javascript #function #object
#javascript #функция #объект
Вопрос:
Я хочу создать приложение javascript, которое работает следующим образом:
- Вызывается функция / пространство имен
bm
. - В начале bm — это просто функция, у которой есть вызываемый метод
setup
, поэтому возможны две вещи: вызовbm()
или определение некоторых вызываемых переменных настройкиbm.setup(settings)
. - Чтобы использовать библиотеку и предоставлять API,
bm
сначала необходимо инициализировать вызов функции:bm(url, options)
. При успешной инициализации API должен быть открыт, поэтомуbm
теперь есть дополнительные методы, такие какbm.method1
,bm.method2
,…
Я не знаю, как именно это возможно, поэтому я хотел бы услышать любые идеи, примеры или предложения. Заранее спасибо.
Ответ №1:
Что приятно, так это то, что функции являются объектами первого класса, поэтому вы можете добавлять к ним методы. Тогда вашей основной функции создания экземпляра просто нужно проверить и убедиться, что она вызывается как экземпляр:
var bm = function(settings) {
if (!(this instanceof bm)) {
return new bm(settings);
}
// Now we are sure we are working with
// a new instance. Let's do stuff here
// to our new object.
}
bm.setup = function(settings) {
return new bm(settings);
}
Это можно вызвать любым из этих способов:
var myObj = new bm();
var myObj = new bm(settings);
var myObj = bm();
var myObj = bm(settings);
var myObj = bm.setup(settings);
Ответ №2:
Может быть, что-то вроде…
function bp ( url, options ) {
if ( !url || !options)
return 'You fail mister';
//declare stuff here:
this.aMethod = function() {...};
this.anAttribute = true;
return this;
}
bp.setup = function( settings ) {
return new bp( predefinedURL, settings);
}
Ответ №3:
Я не вижу здесь никакой проблемы. Возможно, вы захотите добавить функцию обратного вызова к bm(), которая вызывается при инициализации API, например:
onAPIInitialized = function() { use the API };
bm(url, options, onAPIInitialized);
Вы можете добавлять функции в bm, как к обычному объекту:
bm.method1 = function(...) {}