в библиотеках js как $ .something (объект) также может быть $ ("что-то") (функция)? - PullRequest
3 голосов
/ 20 ноября 2010

Это может оказаться простым вопросом с очень сложным ответом или чем-то очень простым, который я только что полностью пропустил, но как в таких библиотеках, как Prototype, jQuery и т. Д., Как глобальная переменная $ может объект, который содержит функции, например:

$.ajax.get(…);

, а также сама функция, например:

$("…");

Любая помощь, даже указатель на более понятный веб-сайт, была бы блестящей, я просто заинтригован!

Например, если я создал функцию ($), которая содержала дочерний объект (ajax), например:

var $ = function() {
    this.ajax = {};
    return this;
}; 

Я мог бы получить доступ к объекту ajax как $().ajax, но не как $.ajax, как вы можете получить их оба?

Ответы [ 3 ]

7 голосов
/ 20 ноября 2010

В JavaScript функции - это объекты, а объекты могут иметь свойства, так что это просто еще одна замечательная часть языка!

var f = function(x) { return x; };
f.attr = "a";
f.attr; // => "a"
f(123); // => 123
3 голосов
/ 20 ноября 2010

все функции javascript являются объектами javascript.

var obj = {};
var func = new function(){};

obj.property = "";
func.property = "";

Вы можете узнать все об этом здесь: http://ejohn.org/apps/learn/#16

0 голосов
/ 23 июля 2012
var $ = (function () {

    var keys = { a: 1, b: 2, c: "Bob" },
        external_func = function (key, val) {
            if (val === undefined) { return keys[key]; }
            keys[key] = val;
            extend(external_func, { key : val });
        };

    function extend (obj, keys) {
        var key;
        for (key in keys) {
            if (keys.hasOwnProperty(key)) {
                obj[key] = keys[key];
            }
        }
    }

    extend(external_func, keys);
    external_func.setKey = function (key, val) { keys[key] = val; this[key] = val; };
    return external_func;
}());

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

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

Cookie («залогинен»);Cookie [ "вошедшего в"];Cookie.username;

Query ("имя_страницы");Запрос [ "название_страница"];Query.page_name;

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

...