Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   User Objects... (https://javascript.ru/forum/misc/1158-user-objects.html)

claster 15.04.2008 20:05

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?

vandy 16.04.2008 10:40

Как вариант:
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; 
  }
}

claster 16.04.2008 15:00

vandy, спасибо за ответ, такой вариант я рассматривал, но у него есть один недостаток, локальная переменная me не видна в методах определенных через prototype :(
Есть еще идеи?

vandy 16.04.2008 15:07

Конечно не работает, Я же написал - "как вариант". И мой пример работает без prototype.
Вопрос - а почему вы используете prototype? Чем не устраивает вариант созданиея объектов, как в моем примере.

Kolyaj 16.04.2008 15:15

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

Цитата:

Сообщение от vandy
Чем не устраивает вариант созданиея объектов, как в моем примере.

В вашем примере для каждого создаваемого объекта будет создаваться свой набор методов, а при использовании prototype он (набор методов) будет один. Т.е. с prototype и быстрее и памяти меньше.

claster 16.04.2008 15:29

Устраивает, но хотелось бы еще услышать варианты, возможно есть лучше решение... к то му же устанавливать методы через прототип лучше при большем количестве объектов, т.к. они не копируются для каждого объекта.
Для данного примера конечно не принципиально но вобщем...

claster 16.04.2008 15:36

Kolyaj, дело не в конкретном примере, просто нужно разобраться и в таком подходе...

Kolyaj 16.04.2008 16:02

claster, так я про подход и говорю, херовый какой-то подход. Вы можете показать реальный пример, где такое может быть полезным?

Dmitry A. Soshnikov 16.04.2008 16:13

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


Но, в твоем случае - нет.

claster 16.04.2008 16:59

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


Часовой пояс GMT +3, время: 17:53.