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, время: 13:12. |