Как расширить объект / функцию JavaScript, чтобы предоставлять методы API после инициализации?

#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(...) {}