Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Какой обьект скушает больше памяти? (https://javascript.ru/forum/misc/34558-kakojj-obekt-skushaet-bolshe-pamyati.html)

viktorina 10.01.2013 01:17

Какой обьект скушает больше памяти?
 
Такой вариант.
function obj1(){
this.func = function(){
alert("Обьект1");
}
}

Или такой вариант, когда обьект использует внешние функции.

function al(msg){
alert(msg)
}

function obj2(){
this.func=function(){
al("Обьект2");
}
}


new obj1() > new obj2()      ???????????


Пока писал понял:))
Но всё же. Как правильно создавать методы обьекта? Они должны быть маленькими и использовать внешние функции, или можно писать функции прямо в обьекте. При создании обьекта память будет расходоваться сильнее?
Как-то тупо описал......ммммм может кто поймёт, что я имею ввиду.

godofjavascript 10.01.2013 02:56

возьми да проверь что кушает больше памяти, в чем проблема?
не умеешь проверять? нажми в хроме F12 там разберешься если знаешь английский. если не знаешь, то завязывай с программированием.

подскажу лишь вкладку Profiles

devote 10.01.2013 03:00

Цитата:

Сообщение от godofjavascript
нажми в хроме F12

для хрома может быть одно, для других браузеров другое.. Что больше кушает тут сложно сказать. А вот что быстрее работает, то obj1 однозначно будет быстрее

godofjavascript 10.01.2013 09:23

Цитата:

Сообщение от devote
для хрома может быть одно, для других браузеров другое..

докажи

devote 10.01.2013 10:11

Цитата:

Сообщение от godofjavascript
докажи

а оно мне надо? я к тому что интерпретаторы в разных браузерах, разные. И сложно понять кто из них и как это обрабатывает.

godofjavascript 10.01.2013 10:12

нет не сложно, если в одном меньше весит то предполагается что и в другом меньше весит.

devote 10.01.2013 10:16

godofjavascript,
с тобой я уж тем более спорить не собираюсь, считай как считаешь

viktorina 10.01.2013 11:26

Ой. Наверное не понятно я написал. Представьте себе, что функция не алерт, а сложные вычисления на 50 строк. И таких методов в обьекте 100. Делать ли вычисления в методах или через методы просто запускать внешние функции .
Как лучше. Недавно я плагин для оперы написал на фреймворке своём, так на одном сайте за 3 мин было сьедено оперой 8гб оперативы.... Получается увесистые обьекты, если вычисления проводить в них, а не через ссылки на функции?

dmitriymar 10.01.2013 11:30

Цитата:

Сообщение от viktorina
. Недавно я плагин для оперы написал на фреймворке своём, так на одном сайте за 3 мин было сьедено оперой 8гб оперативы....

Может у тебя утечка памяти? это к "весу" никакого отношения не имеет

Dmitriyff 10.01.2013 12:00

на мой взгляд у вас оба варианта некорректны,

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

var SuperFunc = function() {
  // n-строк
};

var Obj = function() {

  this.SuperFunc = SuperFunc;
};

var o1 = new Obj();
o1.SuperFunc();

var o2 = new Obj();
o2.SuperFunc();


var Obj = function() {

  this.SuperFunc = function() {
  // n-строк
};
};

var o1 = new Obj();
o1.SuperFunc();

var o2 = new Obj();
o2.SuperFunc();


первый вариант съест меньше памяти

devote 10.01.2013 12:06

var Obj = function() {
}

Obj.prototype.SuperFunc = function() {
    alert("Обьект1");
    return this;
}

var o1 = new Obj();
o1.SuperFunc().SuperFunc().SuperFunc().SuperFunc();

viktorina 10.01.2013 12:41

Цитата:

Сообщение от Dmitriyff
правильно будет вынести эту функцию

Спасибо. А если через прототип добавлять методы, то тоже нужно выносить функции?

viktorina 10.01.2013 12:44

devote,
А через прототип не получится тоже самое?
var Obj = function() {
	}
	 
	Obj.prototype.SuperFunc = function() {
	    alert("Обьект1");
	    return this;
	}

оно не равно 

var Obj = function() {
this.superfunc = function() {
	    alert("Обьект1");
	    return this;
	}	
???

viktorina 10.01.2013 12:59

Цитата:

Сообщение от Дзен-трансгуманист
Это не то же самое, во втором случае каждый раз создается новое замыкание.

То есть самый оптимальный и правильный вариант - добавление методов через прототип?

nerv_ 10.01.2013 13:19

Цитата:

Сообщение от viktorina
Недавно я плагин для оперы написал на фреймворке своём

и при этом ты не знаешь что такое прототип и для чего он используется? :) И еще, судя по всему путает понятия прототип и function.prototype.

http://learn.javascript.ru/prototype

viktorina 10.01.2013 14:09

Цитата:

Сообщение от nerv_
И еще, судя по всему путает понятия прототип и function.prototype.

Хм(делаю умный вид).....:)
Пойду по ссылке почитаю:)

viktorina 10.01.2013 14:25

Цитата:

Сообщение от Дзен-трансгуманист
Добро пожаловать в язык.

Я несколько раз уже читал эту статью давно:)
Сейчас понимаю её наконец-то:)

viktorina 10.01.2013 16:05

Не всё понятно.
function obj(selector){
this.getElements = function(){
              this.e = document.querySelectorAll(selector);
              return this;
              }

this.style= function(st){
              this.e[0].style.color="blue";
              return this;
             }

this.animate = function(anim){
                  .......... ; 
                  return this;}
}


Это лучше делать через прототип? Почему сразу это не вписать в обьект?
function obj(selector){}

obj.prototype.getElements = function(){}
obj.prototype.style = function(){}
obj.prototype.animate = function(){}


Не могу вникнуть в разницу.
Или сразу вписать или потом добавить через prototype.

viktorina 10.01.2013 17:36

Цитата:

Сообщение от Дзен-трансгуманист
ты не создаешь для каждого объекта каждый раз новые свойства для функций и новые функции для этих свойств.

Ваааау:). В статье это не написано:) и я сомневался:). Спасибо.
То есть при создании нового обьекта у меня в памяти будет использовано только то, что занимает
function obj(name){this._name=name;}

А все функции , добавленные в прототип не будут копироваться.
Я как раз и в php понял наследование:)

viktorina 10.01.2013 18:09

Дзен-трансгуманист,
Ваще сказка:). Смотрю сейчас коды , которые хотел понять давно и что-то проясняется теперь.
А приватные свойства возможны?
"a" ведь не будет видно новым методам?
function obj(){
            var a = "Я - приватная переменная";
}
obj.prototype.getA = function(){return a;}//undefined
obj.prototype.A = "Я - публичная переменная";

viktorina 10.01.2013 18:49

Дзен-трансгуманист,
Получается, что нужно в самом обьекте создавать?
function obj(){
	var a = "private";
	this.getA = function(){return a;}
}

Или в javascripte не требуется заморачиваться с private protected.....
Блин получается тема прототипов чуть ли не самая важнецкая....

Hoshinokoe 10.01.2013 19:55

viktorina,

Стоит для начала прочитать книгу "Дэвид Флэнаган - Javascript. Подробное руководство". На все твои вопросы есть подробные ответы. Это основы javascript. Если вдруг не найдешь, тогда уже на форум.

viktorina 10.01.2013 20:24

Цитата:

Сообщение от Hoshinokoe
"Дэвид Флэнаган - Javascript. Подробное руководство"

Читал. Ничего не понял:( . Вернее понял немного, но во многом не видел смысла и не понимал что есть важно , а что второстепенно.
Вот как с прототипами....дошёл до того, что стало чего-то не хватать, начал копать, мне указали на прототипы и я понял их важность.
Форум - круче книги. Я тут за пару дней больше узнал, чем за 3 года книг и экспериментов:). Теперь жаба давит, что всегда брезговал форумами.

viktorina 10.01.2013 21:50

А вот ещё вопрос.
function f(a){
            var b = a;
}

for(var i = 0; i<1000000; i++;){
            f("выполняем много раз");
}

var b = a; //новое место на диске.


Получается так, что каждый раз при вызове функции мы постоянно определяем var a; Как я себе представляю, то компьютер всегда на диске выбирает новое место и записывает туда новые данные. Это ж долго:).
Нельзя ли для каждого нового обьекта создавать отдельное место на диске и просто перезаписывать.... ну в рамках работы этого обьекта. Как бы статическая переменная, но для каждого обьекта своя, чтобы каждая функция использовала свои хранилища.
Может я не правильно понимаю var peremennaya.....за ранее прошу прощения...

Gozar 12.01.2013 13:53

Цитата:

Сообщение от viktorina
при вызове функции мы постоянно определяем var a

Нет, только при создании функции.

Цитата:

Сообщение от viktorina
компьютер всегда на диске выбирает новое место и записывает туда новые данные.

Нет, одно и тоже место и записывает туда новые данные. Имеется в виду память, а не жесткий диск(Хотя у кого swap, может и жесткий диск).

При определении функций и переменных, js создает на них ссылки, к которым привязаны ячейки памяти, в которых в дальнейшем и будет записываться и считываться информация.

Как-то так.

Gozar 12.01.2013 13:57

Жизненный цикл функций

viktorina 12.01.2013 14:35

Gozar,
Спасибо.


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