Как расширить объект / функцию JavaScript для предоставления методов API после инициализации? - PullRequest
0 голосов
/ 13 апреля 2011

Я хочу создать приложение javascript, которое работает следующим образом:

  • Имеет функцию / пространство имен с именем bm.
  • В начале bm - это просто функция, которая имеетметод с именем setup, поэтому возможны две вещи: вызов bm() или определение некоторых переменных установки с вызовом bm.setup(settings).
  • Чтобы использовать библиотеку и предоставить API, bm должен быть сначала инициализирован с помощьювызов функции: bm(url, options).При успешной инициализации API должен быть открыт, поэтому bm теперь имеет дополнительные методы, такие как bm.method1, bm.method2, ...

Я не знаю, насколько точно это возможно, поэтомуЯ хотел бы услышать любые идеи, примеры или предложения.Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

Что приятно, так это то, что функции являются первоклассными объектами, так что вы можете добавлять к ним методы. Тогда вашей основной функции создания экземпляра просто нужно проверить и убедиться, что она вызвана как экземпляр:

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);
0 голосов
/ 13 апреля 2011

Я не вижу здесь никаких проблем. Возможно, вы захотите добавить функцию обратного вызова в bm (), которая вызывается при инициализации API, например:

onAPIInitialized = function() { use the API };
bm(url, options, onAPIInitialized);

Вы можете добавлять функции в bm как к обычному объекту:

bm.method1 = function(...) {}
0 голосов
/ 13 апреля 2011

Может быть, что-то вроде ...

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...