Полу-объект, полу-функция
Я хочу написать такой гибрид (см. название темы), который бы при вызовах:
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() не работает! Почему? |
Для начала ответь на вопрос где у тебя функция-конструктор?
|
hybrid.fn.init() - функция-конструктор
|
Верно. Она у тебя возвращает зачем-то пустой объект. Таким образом ты пытаешься вызвать {}.func() . Но откуда у пустого объекта функция func?
|
<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: |
Uncaught TypeError: Cannot call method 'html' of undefined
В строке "$('test').html('This is text').css({" |
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, упс, исправил. Просто кое-где забыл return дописать. :)
|
Значит func добавляй в прототип, а func2 добавляй как свойство.
|
Часовой пояс GMT +3, время: 08:50. |