Помогите с созданием нового объекта
Помогите начинающему веб-программисту разобраться с ООП. Я хочу создать объект, который что-то делает с блоком <div>, например вставляет туда кнопку при нажатии на которую еще что-то делается ЭТИМ же объектом. Я имею ввиду, что объект внутри блока <div id="DivId"> создается код html с кнопкой, у которой событие - это метод этого же объекта. Что-то типа такого:
function myObj() {
this.a = "Text";
this.func1 = function() {
$("#DivId").html('<input type="button" value="' + this.a + '" onclick="' + this.func2 + '">');
}
this.func2 = function() {alert("Ok")}
this.func1();
}
$().ready(function() {var myBut = new myObj(); });
Как это вообще реализовать? Как правильно задать событие кнопке? Ведь когда эта кнопка присоединиться к дереву, то это уже должно быть как бы обращение к методу funk2 из вне объекта. |
Начинающему программисту лучше пока оставить jQuery в покое и начать читать:
http://dmitrysoshnikov.com/ecmascrip...eneral-theory/ http://dmitrysoshnikov.com/ecmascrip...mplementation/ ну и остальные статьи там и на этом сайте.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>…</title>
</head>
<body>
<div id="test-container"></div>
<script>
if (!Function.prototype.bind) {
Function.prototype.bind = function (obj) {
var args = Array.prototype.slice.call(arguments, 1), thisFunc = this;
function wrap() {
return thisFunc.apply(this instanceof wrap ? this : obj || window, args.concat(Array.prototype.slice.call(arguments)));
}
return wrap;
};
}
var common = {
event: {
add: function (element, eventType, listener) {
var wrap;
if ("addEventListener" in element) {
element.addEventListener(eventType, listener, false);
}
else if ("attachEvent" in element) {
wrap = function () {
listener.call(element, window.event);
}
element.attachEvent("on" + eventType, wrap);
}
return wrap || listener;
}
}
};
function MyObj(node) {
this._container = node;
this.render();
}
MyObj.prototype = {
constructor: MyObj,
buttonCaption: "Text",
message: "Ok",
eventType: "click",
_container: null,
_button: null,
render: function () {
this.addButton();
this.initEvents();
},
addButton: function () {
var btn = document.createElement("input");
btn.type = "button";
btn.value = this.buttonCaption;
this._container.appendChild(btn);
this._button = btn;
},
initEvents: function () {
common.event.add(this._button, this.eventType, this.showMessage.bind(this));
},
showMessage: function () {
alert(this.message);
}
};
new MyObj(document.getElementById("test-container"));
</script>
</body>
</html>
|
Ну Вы жжёте вообще) Я весь мозг сломал пока процентов 20 отсюда понял :)
|
Я плагин видел для Квери,создающий новый объект. Погуглите,найдете его
|
jQuery головного мозга детектед
|
У кого?))
|
Цитата:
|
popov654, вам бы действительно для начала основы подучить. Чего вы хотите добиться этой строкой:
onclick="' + this.func2 + '" Вот как думаете, что у вас туда попадет? |
Цитата:
Цитата:
|
Спасибо за ссылки, но подобную литературу я уже прочла. Но вот несколько моментов осталось непонятых. Я изучила основы JavaScript jQuery, по только ОСНОВЫ. Я могу написать на JavaScript процедурным способом. Т. е. создать 20 функций в скрипте и вызывать из одной функции другую. Так у меня получается. Но я хочу разобраться с ООП, с пространством имен. Мне нужна помощь конкретно в этом примере. Еще раз привожу его, немного изменив. Вот есть страничка index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<script type="text/javascript">
var first = "Первая кнопка",
second = "Вторая кнопка";
function firstBut(){$("#doc").append('<input type="button" value="'+first+'" onclick="secondBut()">');}
function secondBut() {$("#doc").append('<input type="button" value="'+second+'" onclick="ok()">');}
function ok() {alert("ОК!");}
$().ready(function() {firstBut();});
</script>
</head>
<body>
Начало
<div id="doc"></div>
</body>
</html>
Если ее запустить, то все работает. Но тут реализовано процедурным способом. А как сделать так, что бы переменные first и second были свойвствами какого то объекта, а функции firstBut и secondBut - его методами? |
Народ, помогите пожалуйста! Наверняка опытные программисты сталкивались с таким. Если нужно я могу уточнить вопрос...
|
yambbkru,
Создай объект, создай у объекта нужные свойства и методы. А что должен делать скрипт? |
Да этот скрипт - выдуманный. Я его придумала только для того, что бы научится. Я вроде немного разобралась. Если я создаю объект вот так:
function C(a){with (C) {
first = a.b;
second = "Вторая кнопка";
firstBut = function() {$("#doc").append('<input type="button" value="'+first+'" onclick="secondBut()">');}
secondBut = function() {$("#doc").append('<input type="button" value="'+second+'" onclick="ok()">');}
ok = function() {alert("ОК!");}
firstBut();
}};
$().ready(function() {new C({b:"Первая кнопка"});});
то, все работает так же, как и процедурным способом. Буду пока так делать... |
Женщина, все скрипты выдумываются мозгом. Объясни, что он должен делать.
|
Не самый удачный выбран пример. Как я понял нужно что-то типа этого:
function MyWTFObject()
{
this.$obj = $('<div id="my-wtf-object" style="border:1px solid green"></div>').appendTo('body');
this.$firstButton = new Object();
this.$secondButton = new Object();
this.createFirstButton();
}
MyWTFObject.prototype.createFirstButton = function()
{
var obj = this;
this.firstButton = $('<input type="button" value="first-button"/>')
.appendTo(this.$obj)
.click(function(){obj.createSecondButton()});
}
MyWTFObject.prototype.createSecondButton = function()
{
var obj = this;
this.firstButton = $('<input type="button" value="second-button"/>')
.appendTo(this.$obj)
.click(function(){obj.showOk()});
}
MyWTFObject.prototype.showOk = function()
{
alert('ok');
}
/*----------------------------------------------*/
$(function()
{
window.wtfObject = new MyWTFObject();
});
В примере используется ООП совместно с jQuery |
Я не очень поняла ваш пример! Вы можете дописать комментарии? Зачем использовать прототип? Почему просто нельзя добавить свойства и методы объекту?
|
Для того, кто спрашивал что делает скрипт: мой выдуманный скрипт должен при запуске показывать кнопку, при нажатии на которую появляется еще одна кнопка, при нажатии на которую выскакивает сообщение ОК!
|
вот запускаемый скрипт - пример
<body> </body>
<script>
/* создает кнопку с указанным html и обработчиком клика */
function Button( html, handler ){
var a = document.createElement('button');
a.innerHTML = html;
a.onclick = handler;
return a;
};
// когза страница загрузится, отобразим первую кнопку
window.onload = function(){
// не знаю, зачем, но я их сохраняю
var firstB,secondB;
firstB = new Button("первая", function(){
secondB = new Button("вторая", function(){
alert("OK");
});
// добавляем её туда же,куда и первую
firstB.parentNode.appendChild( secondB );
});
// добавляем первую кнопку в <body>
document.body.appendChild( firstB );
};
</script>
это тот же код, но разноцветный.
/* создает кнопку с указанным html и обработчиком клика */
function Button( html, handler ){
var a = document.createElement('button');
a.innerHTML = html;
a.onclick = handler;
return a;
};
// когза страница загрузится, отобразим первую кнопку
window.onload = function(){
var firstB,secondB;
firstB = new Button("первая", function(){
secondB = new Button("вторая", function(){
alert("OK");
});
// добавляем её туда же,куда и первую
firstB.parentNode.appendChild( secondB );
});
// добавляемпервую кнопку в <body>
document.body.appendChild( firstB );
};
использовать Button можно было и без new, но тут эти три буквы добавляют к читаемости кода |
Спасибо большое! Этот пример мне более понятен. Он больше похож на программирование в Делфи: каждая кнопка - объект и все они часть другого объекта - всего документа.
|
Цитата:
//конструктор объекта-прототипа котрый будет всем рулить
function MyWTFObject()
{
//создаем контейнер в который все будет отрисовываться
this.$obj = $('<div id="my-wtf-object" style="border:1px solid green"></div>').appendTo('body');
//объявим что у объекта есть два свойства - это первая и вторая кнопка соответственно
this.$firstButton = new Object();
this.$secondButton = new Object();
//создадим первую кнопку
this.createFirstButton();
}
//метод создает первую кнопку
MyWTFObject.prototype.createFirstButton = function()
{
var obj = this;//переменная obj теперь ссылается на this который в данном контексте ссылается на сам объект (см замыкания)
//создаем кнопку и сохраняем ссылку на нее в соответствующем свойстве объекта
this.firstButton = $('<input type="button" value="first-button"/>')
.appendTo(this.$obj)//отрисовываем кнопку в контейнер
.click(function(){obj.createSecondButton()});//вешаем событие на клик по кнопке, так как указатель this в этом месте не ссылается на текущий объект то используем для доступа к текущему объекту ранее созданную переменную obj
}
//метод создает вторую кнопку
MyWTFObject.prototype.createSecondButton = function()
{
var obj = this;
this.firstButton = $('<input type="button" value="second-button"/>')
.appendTo(this.$obj)
.click(function(){obj.showOk()});
}
//метод аллертует "ok"
MyWTFObject.prototype.showOk = function()
{
alert('ok');
}
/*----------------------------------------------*/
$(function()
{
//зоздаем экземпляр в глобальной области видимости(т.е. просто делаем его свойством window)
window.wtfObject = new MyWTFObject();
});
Цитата:
|
Абсолютно не понятно, зачем нужны эти строчки:
this.$firstButton = new Object(); this.$secondButton = new Object();??? |
Цитата:
|
Спасибо, kadabrik! Так стало понятней. А можно еще попутный вопрос? Я прочла уже несколько раз в учебнике и на этом сайте о наследовании в javascript. Но остались не понятые моменты. Допустим есть класс
function Obj1(c) {
this.a = c;
this.b = function() {alert(this.a);}
this.b();
}
При запуске
var myObj1 = new Obj1("1");
показывает сообщение 1. Теперь я хочу создать новый класс
function Obj2(c) {
this.d = c + [B]this.a[/B];
[B]this.b();[/B]
}
где this.a и this.b() - это свойство и метод объекта Obj1. Как мне связать эти эти объекты? Так?
Obj2.prototype = new Obj1("1")
Но тогда попутно создается и объект Obj1. Я читала про обходные пути, что мол создается объект, а функция-конструктор пустая или копируют свойства из первого объекта во второй... А можно так связать объекты, что бы не создавать первый объект, а только взять его методы? Не скопировать, а как то сослаться не создавая его? Тем более строчка с прототипом должна быть написана вне обеих функций, я так поняла. Но было бы гораздо удобнее связать функции в теле второй функции Obj2. Так можно сделать? И еще вопрос. Что значит строчка О1 = Obj1 ? Как в этом случае ведут себя оба класса? Если в правый добавить свойства что будет? А если в левый? И что сделалось с прототипом? |
yambbkru, если речь идет о наследовании, то в js есть несколько способов его реализовать. Лично мне больше всего нравится этот метод. Для наследования именно свойств, а не методов лучше подходит вызов конструктора родителя в конструкторе потомка: MyClass.superclass.constructor.call(this). После этого все переменные объявленные в конструкторе родителя будут и у потомка.
|
Цитата:
function Obj1(c) {
this.a = c;
this.b = function() {
alert(this.a);
}
this.b();
}
var myObj1 = new Obj1("1");
function Obj2(c) {
debugger
this.d = c + this.a;
this.b();
}
*!*
Obj2.prototype = myObj1;
*/!*
// создадим экземпляр второго объекта, чтобы проверить работоспособность
new Obj2('c');
выдает два алерта, в которых 1. Цитата:
|
melky, как же всетаки текст на аватарке контрастирует с началом предыдущего сообщения :)
|
Я увидел здесь разговор о var..Скажите пожайлуста, существет ли АНИМИРОВАНЫЙ АЛЕРТ и АНИМИРОВАНЫЙ var наподобие счетчика ? .Алерт выводит только стационарное значение var.
Причина вопроса такая_ меняется ширина картинки,ее анимированная ширина динамически передается другому объекту для его css.Как быть? |
Цитата:
|
Цитата:
|
А можно еще спросить? Вот есть такие 2 функции:
function a() {
var t = {
c : "1"
}
return t
}
function b() {
var t = {
d : "2"
}
return t
}
var A = a();
var B = b();
alert(A.c + B.d)
В результате выдает сообщение "12". Как мне сделать, что бы все объекты, создаваемые функцией b() имели своим прототипом объект, создаваемый функцией а()? |
b.prototype = new a();
|
Цитата:
|
А зачем там new? а() и b() - это функции, которые возвращают объекты. Это не конструкторы, я так понимаю. Объект создается внутри этих функций. Мне действительно не нужен лишний объект а!!! Я пока вижу только один способ наследования: копирование всех свойств из а() в b(). Но мне это не совсем нравится, поскольку лишнее время затрачивается на это копирование. Хотелось бы через прототип.
|
Цитата:
Цитата:
|
Хочешь через объект-прототип? Рекомендую самую обычную реализацию:
function B(){
this.d = 2;
};
B.prototype.c = 1;
var b = new B;
alert( b.c + b.d );
|
Спасибо, но мне не нужно реализовывать выдуманную мной задачу для примера другими способами! Мне нужен совет по поводу именно такой моей реализации. Пожалуйста, если кто может, помогите. Нужно те две функции как-то связать через прототип.
|
| Часовой пояс GMT +3, время: 22:25. |