шаблон разработки плагина jQuery (обычная практика?) для контакта с [закрытыми] закрытыми функциями

9
задан ThinkingStiff 24 July 2012 в 20:52
поделиться

3 ответа

Как насчет (в объеме плагина):

var fill = function ()
{
    (function (color) 
    {
        this.css ('backgrorund-color', color);
        //.. your stuff here ...
    }).apply (this, arguments);
}

$.fn.myplugin = function ()
{
    fill ('green');
}

Тот путь, заливка сохранит контекст jQuery, в котором вы находитесь, и является все еще частным к вашему плагину


Исправленный: вышеупомянутое является неправильным обзором w.r.t., Попыткой следующее вместо этого:

var fill = function (color)
{
    if (!$this) return; // break if not within correct context

    $this.css ('backgrorund-color', color);
    //.. your stuff here ...
}

$.fn.myplugin = function ()
{
    var $this = $(this); // local ref to current context
    fill ('green');
}
2
ответ дан 4 December 2019 в 13:01
поделиться

Сначала одно : если вы хотите вызвать что-то вроде this.fill('red');, где this является экземпляром jQuery, вы должны расширить прототип jQuery и сделать fill() "public". jQuery предоставляет руководство по расширению прототипа с помощью так называемых "плагинов", которые могут быть добавлены с помощью $.fn.fill, что является тем же самым, что и jQuery.prototype.fill.

В обратных вызовах jQuery, это часто является ссылкой на HTML элемент, и вы не можете добавить прототипы к ним (пока). Это одна из причин, по которой jQuery обертывает элементы и возвращает экземпляры jQuery, которые могут быть легко расширены.

Используя синтаксис (function(){})();, вы можете создавать и выполнять "приватный" javascript на лету, и все это исчезнет, когда все будет сделано. Используя эту технику, вы можете создать свой собственный jQuer-подобный синтаксис, который обернет jQuery в ваш собственный приватный цепной объект.

(function(){
    var P = function(elem) {
        return new Private(elem);
    };
    var Private = function(elem) {
        this.elem = jQuery(elem);
    }
    Private.prototype = {
        elem: null,
        fill: function(col) {
            this.elem.css('background',col);
            return this;
        },
        color: function(col) {
            this.elem.css('color', col);
            return this;
        }
    }

    $.fn.myplugin = function() {
        P(this).fill('red');
    };
    $.fn.myotherplugin = function() {
        P(this).fill('yellow').color('green');
    };

})();

$('.foo').myplugin();
$('.bar').myotherplugin();

console.log(typeof P === 'undefined') // should print 'true'

Таким образом, P означает ваш собственный инструментарий "частных" функций. Они не будут доступны нигде в коде, ни в пространстве имён jQuery, если вы не прикрепите их куда-нибудь. Вы можете добавить в объект Private столько методов, сколько захотите, и пока вы возвращаете this, вы также можете связать их в цепочку в стиле jQuer, как я сделал это в примере.

11
ответ дан 4 December 2019 в 13:01
поделиться

К сожалению, «частные» методы (или любое свойство для этого) могут никогда не вызываются с помощью префикса «Это» в JavaScript. Все, что называется this.myfunc (myargs) , должно быть общедоступно.

и «частные» методы могут быть вызваны только из-за объема, в которой они были определены.

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

this.fill('green');
//or
fill(this,'green');

, как вы можете видеть, они оба занимают точно так же символы в вашем коде.

Извините, что сказать, но вы застряли с этим как решение, если вы не хотите создать новое пространство имен и сделать их Private - это просто добавить к количеству кода Надо писать, то есть то, что вы косвенно называли «не напрямую выставленные»:

this.myplugin.fill('green');

... - это больше добросовестно, таким образом, поражает цель.

JavaScript не похож на другие языки, нет «частных» участников Per-SE, только участники, доступные в закрытиях, которые иногда могут использоваться аналогичным образом для частных членов, но это больше «обходной путь», а также Не имеющие частные члены «Real-Deal», которые вы ищете.

Это может быть трудно прийти к срокам с этим (я часто борьбу), но не Не пытайтесь переселить JavaScript в том, что вы понимаете с других языков, возьмите его для того, что это ...

1
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: