Библиотека для своего сайта
Здравствуйте.
Для сайта делаю свой тулкит - чтобы не было ничего лишнего, при этом, всё работало именно так, как надо мне... да и просто, хотелось бы понять, как это работает. Суть проста - надо, чтобы можно было работать с ней как просто используя $.function(), так и $(element).function. Как такое реализовать? Просмотрел jQuery - код слишком большой, в Гугле нашёл что-то похожее, но не работает по $(element).function. Спасибо. |
Ваш вопрос понять непросто.
Я понял так, что вам нужно что-то вроде этого // создадим функцию конструктор которая будет принимать параметры и возвращать обьект f=function(par1){ // присвоим переданное значение, св-ву param (это же типо конструктор, должны же мы чтото присвоить :) ) f.param=par1; return f; } // param - это значение по умолчанию f.param="Hello world"; // метод обьекта f f.test =function (){ alert (f.param); return this; } f.test2=function(){ alert ("bla bla =" + f.param); } //========== проверка. =============// // Обращение к обьекту alert("эксперемент 1"); f.test(); alert("эксперемент 2"); // Обращение к двум функциям по цепочке f.test().test2(); // обращение к функции alert("эксперемент 3"); f("прощай жестокий мир").test(); // обращение к функциям по цепочке alert("эксперемент 4"); f("прощай жестокий мир").test().test2(); P.S. Это даже близко не аналог Jquery, jquery каждый раз при обращении к $("селектор") создаёт новый обьект jquery. Данный же пример работает с одним и тем же обьектом постоянно. |
Спасибо. Я ночью начал его модифицировать под создание нового объекта (так как надо именно это), но вырубился. Сейчас продолжу.
|
Что-то придумал. Но, почему-то, при втором вызове - Type Error "called_non_callable".
LaMF = function(q) { return new LaMF.c.init(q); } LaMF.c = { init: function(q) { LaMF = { q: "Hello World", test: function () { console.log(q); } }; LaMF.q = q; return LaMF; } } |
(function( window, undefined ) { LaMF = function(q) { return new init(q); } init = function(q) { LaMF = { q: "Hello World", test: function () { console.log(q); } }; LaMF.q = q; return LaMF; } window.$ = LaMF; })( window ); Так работает. |
Не работает через $ без скобок. Вроде работало...
|
Интересно как оно работало ?
для того чтобы метод q появился в laMF, нужно выполнить init а если init выполнится он затрёт функию laMF, обьектом. |
Одно из решений которые приходят в голову, это копировать свойства из LaMF в конструктор.
пример <script> (function( window, undefined ) { LaMF = function(q) { // размещаем конструктор прямо внутри функции return new (function(q1){ // копируем свойства из LaMF в this extend (this,LaMF); this.test1=q1; })(q) } LaMF.test1="i test1"; LaMF.test2="i test2"; })( window ); </script> естественно тебе потребуются, метод для копирования свойств, extend. Написать его придётся самим. |
Лови рабочий вариант.
(function( window, undefined ) { // метод extend, почти аналогичен методу в jquery (не поддерживает глубокое копирование) function extend(target,options){ for ( name in options ) { src = target[ name ]; copy = options[ name ]; // если св-во уже есть, мы его не копируем if ( src === copy ) { continue; } if ( copy !== undefined ) { target[ name ] = copy; } } return target; } LaMF = function(q) { // размещаем конструктор прямо внутри функции return new (function(q1){ // копируем свойства из LaMF в this extend (this,LaMF); this.test1=q1; })(q) } LaMF.test1="Я оригинальное свойство"; LaMF.test2="Если ты меня видешь, значит я скопирывалось"; window.$=LaMF; })( window ); // создаём новый обьект, и смотрим свойство alert( $("Я установленное свойство" ).test1); // смотрим свойство в оригенале alert( $.test1 ); // проверяем доступны ли нам скопированные свойства alert( $("бла бла").test2 ); Ещё одно, быстродействующие решение на прототипах. (фурычит под хром, оперу и firefox, под ie код надо модифицировать) (function( window, undefined ) { LaMF = function(q) { // размещаем конструктор прямо внутри функции return new (function(q1){ this.__proto__ = LaMF; this.test1=q1; })(q) } LaMF.test1="Я оригинальное свойство !"; LaMF.test2="Если ты меня видешь, значит я скопировалось !"; window.$=LaMF; })( window ); // создаём новый обьект, и смотрим свойство alert($("Я установленное свойство !").test1); // смотрим свойство в оригенале alert($.test1); // проверяем доступны ли нам скопированные свойства alert($("1").test2); |
Спасибо! Так как большая часть сайта всё равно пока не работает под IE (много HTML5 и CSS3), буду использовать второй вариант.
|
Часовой пояс GMT +3, время: 15:51. |