Jump to content
  • 0

ООП - кто как юзает?


Great Rash
 Share

Question

Я всегда использовал объекты с прототипами, но частенько встречаю запись вида:

var Obj = {
x: 1,
test: function() {
alert(this.x);
}
}

Выглядит конечно элегантно, но возникает вопрос: как в объект, объявленный таким образом, передать параметры?

Ничего лучше, чем написать вот так не придумал:

var Obj = {
__construct: function(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
},

getParams: function() {
alert(this.x + ', ' + this.y + ', ' + this.z);
}
}


Obj.__construct(1, 2, 3);
Obj.getParams();

Эту идею взял из PHP.

Насколько так правильно инициировать параметры объекта и как это делаете вы?

Еще интересно, как можно защитить переменную Obj от перезаписи, ведь она глобальная?

Еще интересно стоит ли вообще переходить на такой стиль или лучше продолжать юзать прототипы?

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0
Я всегда использовал объекты с прототипами, но частенько встречаю запись вида:

var Obj = {
x: 1,
test: function() {
alert(this.x);
}
}

Выглядит конечно элегантно, но возникает вопрос: как в объект, объявленный таким образом, передать параметры?

Obj.test();

Obj.y = 2;

Obj.newFunction = function() { alert( this.y ) };

Obj.newFunction();

Ничего лучше, чем написать вот так не придумал:

var Obj = {
__construct: function(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
},

getParams: function() {
alert(this.x + ', ' + this.y + ', ' + this.z);
}
}

function Obj( x, y, z) {
this.x = x;
this.y = y;
this.z = z;
this.getParams = function(){ ... }
}

Или лучше (не всегда, правда)

Obj.prototype.getParams = function...

Насколько так правильно инициировать параметры объекта и как это делаете вы?

Еще интересно, как можно защитить переменную Obj от перезаписи, ведь она глобальная?

Еще интересно стоит ли вообще переходить на такой стиль или лучше продолжать юзать прототипы?

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

Link to comment
Share on other sites

  • 0
Дорогой друг s0rr0w, а скажи плиз, почему лучше создавать метод у прототипа класса,Obj.prototype.getParams = function... нежели в самом экземляре?

	var foo = function ( ) {
this.x = 1;
this.y = 2;
this.boom = function ( ) {
alert( "This x = " + this.x );
}
}

var a1 = new foo();
a1.boom();

foo.prototype.bah = function( ){ alert( "This y = " + this.y ) };

a1.bah(); // функция доступна, потому что изменен прототип

foo.boom = function( ) { alert( "x + y = " + ( this.x + this.y ) ) };

a1.boom(); // Покажет This x = 1, потому что будет создано новое свойство у объекта функции, а не у прототипа

foo.prototype.bah = function(){ alert( "x + y = " + ( this.x + this.y ) ) };

a1.bah(); // А вот тут все нормально, функция переопределяется

Link to comment
Share on other sites

  • 0

Фишка в наследовании. И это один из самых интересных и удобных моментов ооп:

Если создавать метод напрямую для каждого экземпляра то он и будет запоминаться для каждого экземпляра, что будет жрать память.

А вот если определять метод для прототипа экземпляра, то есть для его конструктора, все экземпляры будут наследовать один единственный метод - объем памяти сократиться в разы.

Link to comment
Share on other sites

  • 0
А вот если определять метод для прототипа экземпляра, то есть для его конструктора, все экземпляры будут наследовать один единственный метод - объем памяти сократиться в разы.

По сравнению с тем, как память жрет DOM, это сущие крохи.

Link to comment
Share on other sites

  • 0

s0rr0w, спасибо.

А вот ещё вопросы:

1) Ты пишешь так var foo = function ( ){}, т.е. выходит, что присваиваешь переменной функцию?

2) Видел, что многие делаю так function foo(){}, а далее уже как и ты, var a1 = new foo();. Есть ли разница в том, как делать и вообще как лучше и для чего?

3) А какая разница в написании методов в самом конструкторе, так:

	var foo = function ( ) {
this.boom = function ( ) {
alert( "This x = " + this.x );
}
}

и например в прототипе конструктора:

foo.prototype.boom = function( ){ alert( "This y = " + this.x ) };

?

4) Как я понял, вот этот способ foo.boom = function( ) { alert( "x + y = " + ( this.x + this.y ) ) }; создаёт метод самого конструктора, т.е и обращаться к нему можно будет только через этот же конструктор? Если так, то зачем вообще нужны такие методы и т.д.?

Link to comment
Share on other sites

  • 0
s0rr0w, спасибо.

А вот ещё вопросы:

1) Ты пишешь так var foo = function ( ){}, т.е. выходит, что присваиваешь переменной функцию?

Да, переменной присваиваю анонимную функцию.

2) Видел, что многие делаю так function foo(){}, а далее уже как и ты, var a1 = new foo();. Есть ли разница в том, как делать и вообще как лучше и для чего?

Лично я делаю так, чтобы был порядок "деклараций" функций в коде.

alert( x ); // работает
alert( y ); // не работает

function x( ) { }
var y = function() {}

3) А какая разница в написании методов в самом конструкторе, так:

и например в прототипе конструктора: ?

Разница только в том, сколько памяти кушает каждый из вариантов, и можно ли переопределить в один прекрасный момент этот метод всем экземплярам этого класса.

4) Как я понял, вот этот способ foo.boom = function( ) { alert( "x + y = " + ( this.x + this.y ) ) }; создаёт метод самого конструктора, т.е и обращаться к нему можно будет только через этот же конструктор? Если так, то зачем вообще нужны такие методы и т.д.?

Не могу привести адекватный пример, так как я не пользуюсь такими извращениями.

Обратиться к данной функции можно вот так a1.constructor.boom

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy