Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Полу-объект, полу-функция (https://javascript.ru/forum/misc/39717-polu-obekt-polu-funkciya.html)

Valdemor 09.07.2013 13:17

Полу-объект, полу-функция
 
Я хочу написать такой гибрид (см. название темы), который бы при вызовах:
hybrid().func();

и
hybrid.func2();

вызывал бы соответствующие функции.
Я вспомнил, что подобный подход был в jQuery. Я двигался несколько дней подряд, но решил-таки спросить здесь.
Мой код:
var hybrid = window.hybrid = function(text) {
   return new hybrid.fn.init(text)
}
hybrid.fn = hybrid.prototype = {
   init: function(text) {
      return {};
   },
   func: function() {
      alert("It's work!");
   }
}
hybrid.func2 = function() {alert("Func2!");}
hybrid.fn.init.prototype = hybrid.fn;

Но вызов hybrid("sometext").func() не работает! Почему?

danik.js 09.07.2013 13:22

Для начала ответь на вопрос где у тебя функция-конструктор?

Valdemor 09.07.2013 13:23

hybrid.fn.init() - функция-конструктор

danik.js 09.07.2013 13:28

Верно. Она у тебя возвращает зачем-то пустой объект. Таким образом ты пытаешься вызвать {}.func() . Но откуда у пустого объекта функция func?

ruslan_mart 09.07.2013 13:29

<div id="test"></div>
<div id="test2">Hello World!</div>


var $ = function(a)
{
   if(this.$) return new $(a);

   this.elem = document.getElementById(a);
}

$.prototype = {
   css: function(obj, str)
   {
       if(typeof obj == 'object') for(var i in obj) this.elem.style[i] = obj[i];
       else if(typeof obj == 'string' && str) this.elem.style[obj] = str;
       return this;
   }
   html: function(text)
   {
       if(text) this.elem.innerHTML = text;
       else return this.elem.innerHTML;
       return this;
   }
}


$('test').html('This is text').css({
   color: 'red',
   fontWeight: 'bold',
   textAlign: 'center'
});

alert( $('test2').html() ); //Hello World!

$('test2').css('color', 'green');


Как пример.
:write:

Valdemor 09.07.2013 13:39

Uncaught TypeError: Cannot call method 'html' of undefined
В строке "$('test').html('This is text').css({"

danik.js 09.07.2013 13:39

var hybrid = function(){
    return (this instanceof hybrid) ? this : new hybrid();
};
hybrid.func = function() {
    alert("It's works!");
};
hybrid.prototype = hybrid.constructor = hybrid;


hybrid.func();
hybrid().func();

Valdemor 09.07.2013 13:44

Цитата:

Сообщение от danik.js (Сообщение 261281)
Верно. Она у тебя возвращает зачем-то пустой объект. Таким образом ты пытаешься вызвать {}.func() . Но откуда у пустого объекта функция func?

Цитата:

Сообщение от danik.js (Сообщение 261285)
var hybrid = function(){
    return (this instanceof hybrid) ? this : new hybrid();
};
hybrid.func = function() {
    alert("It's works!");
};
hybrid.prototype = hybrid.constructor = hybrid;


hybrid.func();
hybrid().func();

Суть в том, чтобы функции func и func2 вызывались только для hybrid() и hybrid соответственно, т.е. чтобы func2 не вызывался с помощью объекта hybrid.

ruslan_mart 09.07.2013 13:48

Valdemor, упс, исправил. Просто кое-где забыл return дописать. :)

danik.js 09.07.2013 13:50

Значит func добавляй в прототип, а func2 добавляй как свойство.


Часовой пояс GMT +3, время: 09:07.