Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.04.2008, 20:05
Интересующийся
Отправить личное сообщение для claster Посмотреть профиль Найти все сообщения от claster
 
Регистрация: 10.03.2008
Сообщений: 11

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?
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2008, 10:40
Интересующийся
Отправить личное сообщение для vandy Посмотреть профиль Найти все сообщения от vandy
 
Регистрация: 24.03.2008
Сообщений: 27

Как вариант:
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; 
  }
}
Ответить с цитированием
  #3 (permalink)  
Старый 16.04.2008, 15:00
Интересующийся
Отправить личное сообщение для claster Посмотреть профиль Найти все сообщения от claster
 
Регистрация: 10.03.2008
Сообщений: 11

vandy, спасибо за ответ, такой вариант я рассматривал, но у него есть один недостаток, локальная переменная me не видна в методах определенных через prototype
Есть еще идеи?
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2008, 15:07
Интересующийся
Отправить личное сообщение для vandy Посмотреть профиль Найти все сообщения от vandy
 
Регистрация: 24.03.2008
Сообщений: 27

Конечно не работает, Я же написал - "как вариант". И мой пример работает без prototype.
Вопрос - а почему вы используете prototype? Чем не устраивает вариант созданиея объектов, как в моем примере.
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2008, 15:15
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

claster, измените логику программы. К примеру, передавайте div в качестве аргумента функции bg, а то фигня какая-то получается.

Сообщение от vandy
Чем не устраивает вариант созданиея объектов, как в моем примере.
В вашем примере для каждого создаваемого объекта будет создаваться свой набор методов, а при использовании prototype он (набор методов) будет один. Т.е. с prototype и быстрее и памяти меньше.
Ответить с цитированием
  #6 (permalink)  
Старый 16.04.2008, 15:29
Интересующийся
Отправить личное сообщение для claster Посмотреть профиль Найти все сообщения от claster
 
Регистрация: 10.03.2008
Сообщений: 11

Устраивает, но хотелось бы еще услышать варианты, возможно есть лучше решение... к то му же устанавливать методы через прототип лучше при большем количестве объектов, т.к. они не копируются для каждого объекта.
Для данного примера конечно не принципиально но вобщем...
Ответить с цитированием
  #7 (permalink)  
Старый 16.04.2008, 15:36
Интересующийся
Отправить личное сообщение для claster Посмотреть профиль Найти все сообщения от claster
 
Регистрация: 10.03.2008
Сообщений: 11

Kolyaj, дело не в конкретном примере, просто нужно разобраться и в таком подходе...
Ответить с цитированием
  #8 (permalink)  
Старый 16.04.2008, 16:02
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

claster, так я про подход и говорю, херовый какой-то подход. Вы можете показать реальный пример, где такое может быть полезным?
Ответить с цитированием
  #9 (permalink)  
Старый 16.04.2008, 16:13
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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;
}


Но, в твоем случае - нет.
Ответить с цитированием
  #10 (permalink)  
Старый 16.04.2008, 16:59
Интересующийся
Отправить личное сообщение для claster Посмотреть профиль Найти все сообщения от claster
 
Регистрация: 10.03.2008
Сообщений: 11

Видимо я не правильно поставил вопрос... я пытаюсь разобраться в объектном подходе, а именно: есть пользовательский объект с набором методов, некоторые методы используют родственные методы и свойства, как применить один или несколько методов к HTML элементу или группе без издержек т.е. копирования методов пользовательского объекта для каждого HTML элемента... как то так, уж простите в ООП я пока не силен.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DOM Objects Systemnik Events/DOM/Window 3 17.06.2008 19:47