Сделать скобки в вызовах функций необязательными - PullRequest
3 голосов
/ 22 января 2011

Эй, я собираюсь переписать основной файл для моей библиотеки JavaScript, и я ищу лучшие способы сделать все.Одним из них является то, как я могу сделать скобки необязательными, например, некоторые вызовы функций выглядят следующим образом.

Spark('p').content('Hello, World');

И другие подобные этому.

Spark.browser();

Поэтому у меня есть дополнительные скобки для Sparkфункция.Правильно ли я сказал, что это будет лучшим способом?

window.Spark = function(arg1, arg2) {
    return {
        fn: function() {
            alert('run');
        }
    };
};

for(var f in Spark())
    Spark[f] = Spark()[f];

Spark.fn();
Spark(true, false).fn();

Мне кажется, это неправильно, хотя это единственный метод, который я нашел, который работает.

Ответы [ 2 ]

1 голос
/ 22 января 2011

Вы на правильном пути, но будьте осторожны.В нынешнем виде функция fn будет создаваться каждый раз, когда вы вызываете Spark(...), что приведет к незначительным проблемам с производительностью и использованием памяти.

Более чистый подход - использовать класс и хранить все эти функции в прототипе, чтобы избежать ненужного использования памяти:

window.Spark = (function(){

  function inner(arg1, arg2) {
    this.arg1 = arg1;
    this.arg2 = arg2;
  }

  inner.prototype = {
    fn : function() { alert('run') }
  };

  function S(arg1, arg2) { return new inner(arg1, arg2) }

  var dflt = S();
  for (var f in dflt) S[f] = dflt[f];

  return S;
})();
0 голосов
/ 22 января 2011

Да, это возможно, но зачем вам это делать?Чтобы JavaScript выглядел как несколько других языков (таких как VB и Delphi), которым не нужны скобки (квадратные скобки) для функций?Создатели JavaScript решили, что функцию следует вызывать с круглыми скобками, независимо от количества параметров.Вы на самом деле создаете свойства, которые ссылаются на результаты функции, чтобы пропустить два символа.

Я думаю, что вы на самом деле ищете, это класс или объект.Вы могли бы написать это:

function MyClass(Parameter /*optional*/)
{
  // Initialization (optional)
  this.anyProperty = parameter;

  this.anyMethod = function(p)
  {
    alert(p);
  }
}

// Or declare methods like this (faster and more efficient)
MyClass.prototype.anyMethod2 = function(p)
{
  alert(p);
}

Теперь вы можете создать экземпляр этого класса и вызвать методы:

var c = new MyClass;
c.anyMethod2('Hello world!');

Это только небольшой пример, но вы должны действительно прочитать об объявлении и использованиизанятия, потому что я думаю, что это может быть то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...