User Objects...
Добрый вечер, господа, требуется помощь... есть код:
window.onload=function(){ div=document.createElement("DIV") div.style.cssText="width:100px;height:100px;border :1px solid blue;" document.body.appendChild(div); user_obj=new UserObject(); user_obj.bg.call(div); // $1 } function UserObject(){ this.color="blue"; } UserObject.prototype.bg=function(){ //$2 this.style.backgroundColor="red"; } Как в методе bg (отмечено $2) достучаться до свойства color этого же объекта если this уже ссылается на HTML элемент div, смотри выше отмечено $1? |
Как вариант:
div=document.createElement("DIV")
div.style.cssText="width:100px;height:100px;border :1px solid blue;"
document.body.appendChild(div);
user_obj=new UserObject();
user_obj.bg.call(div);
function UserObject(){
var me = this;
me.color="blue";
me.bg=function(){
this.style.backgroundColor=me.color;
}
}
|
vandy, спасибо за ответ, такой вариант я рассматривал, но у него есть один недостаток, локальная переменная me не видна в методах определенных через prototype :(
Есть еще идеи? |
Конечно не работает, Я же написал - "как вариант". И мой пример работает без prototype.
Вопрос - а почему вы используете prototype? Чем не устраивает вариант созданиея объектов, как в моем примере. |
claster, измените логику программы. К примеру, передавайте div в качестве аргумента функции bg, а то фигня какая-то получается.
Цитата:
|
Устраивает, но хотелось бы еще услышать варианты, возможно есть лучше решение... к то му же устанавливать методы через прототип лучше при большем количестве объектов, т.к. они не копируются для каждого объекта.
Для данного примера конечно не принципиально но вобщем... |
Kolyaj, дело не в конкретном примере, просто нужно разобраться и в таком подходе...
|
claster, так я про подход и говорю, херовый какой-то подход. Вы можете показать реальный пример, где такое может быть полезным?
|
claster, вынеси определение bg выше вызова user_obj.bg.call(div);. А все дело в том, что функции могут объявляться как Statement и как Declaration.
Чтобы увидеть разницу, попробуй так:
a();// работает
function a() {
alert(1);
}
a();// не работает
var a = function() {
alert(1);
}
Поэтому вот это работает:
function UserObject() {
this.color = 'blue';
return true;
}
UserObject.prototype.bg = function() {
this.style.backgroundColor = 'red';
return true;
}
var div = document.createElement("DIV")
div.style.cssText = "width:100px;height:100px;border :1px solid blue;"
document.body.appendChild(div);
var user_obj = new UserObject();
user_obj.bg.call(div); // $1
И даже это работает (сам UserObject описан ниже всех, но он является декларацией, а не стейтментом):
UserObject.prototype.bg = function() {
this.style.backgroundColor = 'red';
return true;
}
var div = document.createElement("DIV")
div.style.cssText = "width:100px;height:100px;border :1px solid blue;"
document.body.appendChild(div);
var user_obj = new UserObject();
user_obj.bg.call(div); // $1
function UserObject() {
this.color = 'blue';
return true;
}
Но, в твоем случае - нет. |
Видимо я не правильно поставил вопрос... я пытаюсь разобраться в объектном подходе, а именно: есть пользовательский объект с набором методов, некоторые методы используют родственные методы и свойства, как применить один или несколько методов к HTML элементу или группе без издержек т.е. копирования методов пользовательского объекта для каждого HTML элемента... как то так, уж простите в ООП я пока не силен.
|
| Часовой пояс GMT +3, время: 21:21. |