Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.07.2013, 13:17
Кандидат Javascript-наук
Отправить личное сообщение для Valdemor Посмотреть профиль Найти все сообщения от Valdemor
 
Регистрация: 30.03.2012
Сообщений: 128

Полу-объект, полу-функция
Я хочу написать такой гибрид (см. название темы), который бы при вызовах:
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() не работает! Почему?
Ответить с цитированием
  #2 (permalink)  
Старый 09.07.2013, 13:22
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Для начала ответь на вопрос где у тебя функция-конструктор?
Ответить с цитированием
  #3 (permalink)  
Старый 09.07.2013, 13:23
Кандидат Javascript-наук
Отправить личное сообщение для Valdemor Посмотреть профиль Найти все сообщения от Valdemor
 
Регистрация: 30.03.2012
Сообщений: 128

hybrid.fn.init() - функция-конструктор
Ответить с цитированием
  #4 (permalink)  
Старый 09.07.2013, 13:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Верно. Она у тебя возвращает зачем-то пустой объект. Таким образом ты пытаешься вызвать {}.func() . Но откуда у пустого объекта функция func?
Ответить с цитированием
  #5 (permalink)  
Старый 09.07.2013, 13:29
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

<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');


Как пример.

Последний раз редактировалось ruslan_mart, 09.07.2013 в 13:47.
Ответить с цитированием
  #6 (permalink)  
Старый 09.07.2013, 13:39
Кандидат Javascript-наук
Отправить личное сообщение для Valdemor Посмотреть профиль Найти все сообщения от Valdemor
 
Регистрация: 30.03.2012
Сообщений: 128

Uncaught TypeError: Cannot call method 'html' of undefined
В строке "$('test').html('This is text').css({"
Ответить с цитированием
  #7 (permalink)  
Старый 09.07.2013, 13:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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();
Ответить с цитированием
  #8 (permalink)  
Старый 09.07.2013, 13:44
Кандидат Javascript-наук
Отправить личное сообщение для Valdemor Посмотреть профиль Найти все сообщения от Valdemor
 
Регистрация: 30.03.2012
Сообщений: 128

Сообщение от danik.js Посмотреть сообщение
Верно. Она у тебя возвращает зачем-то пустой объект. Таким образом ты пытаешься вызвать {}.func() . Но откуда у пустого объекта функция func?
Сообщение от danik.js Посмотреть сообщение
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.
Ответить с цитированием
  #9 (permalink)  
Старый 09.07.2013, 13:48
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Valdemor, упс, исправил. Просто кое-где забыл return дописать.
Ответить с цитированием
  #10 (permalink)  
Старый 09.07.2013, 13:50
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция при наведении на Canvas объект max0n Общие вопросы Javascript 0 07.05.2013 17:56
Передать ссылку на объект а не объект возникновения события Blazze Events/DOM/Window 0 11.10.2011 00:45
jQuery - объект или функция? jazzz13 jQuery 8 16.08.2011 04:01
функция должна возвращать объект без одного свойства blackzub Общие вопросы Javascript 4 14.12.2009 19:25
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 13:31