Как насчет (в объеме плагина):
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');
}
Сначала одно : если вы хотите вызвать что-то вроде 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, как я сделал это в примере.
К сожалению, «частные» методы (или любое свойство для этого) могут никогда не вызываются с помощью префикса «Это» в JavaScript. Все, что называется this.myfunc (myargs)
, должно быть общедоступно.
и «частные» методы могут быть вызваны только из-за объема, в которой они были определены.
Ваше оригинальное решение - единственный, кто будет работать. Да, это боль, необходимая в это
, но нет большего извлеченности, чем было бы возможно, если бы ваша невозможная просьба была возможна:
this.fill('green');
//or
fill(this,'green');
, как вы можете видеть, они оба занимают точно так же символы в вашем коде.
Извините, что сказать, но вы застряли с этим как решение, если вы не хотите создать новое пространство имен и сделать их Private - это просто добавить к количеству кода Надо писать, то есть то, что вы косвенно называли «не напрямую выставленные»:
this.myplugin.fill('green');
... - это больше добросовестно, таким образом, поражает цель.
JavaScript не похож на другие языки, нет «частных» участников Per-SE, только участники, доступные в закрытиях, которые иногда могут использоваться аналогичным образом для частных членов, но это больше «обходной путь», а также Не имеющие частные члены «Real-Deal», которые вы ищете.
Это может быть трудно прийти к срокам с этим (я часто борьбу), но не Не пытайтесь переселить JavaScript в том, что вы понимаете с других языков, возьмите его для того, что это ...