Полу-объект, полу-функция
Я хочу написать такой гибрид (см. название темы), который бы при вызовах:
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, время: 13:58. |