Правильное оформление объекта
Встала необходимость освоить JS на хорошем уровне. Возник вопрос.
В чем ключевое отличие между способами создания объектов и их членов/методов? Также почему я часто вижу какие-то велосипеды для эмуляции приватных свойств, когда они и так есть "из коробки" ? Вот пример:
// Как начал писать я
function foo(init_params) {
var self = this; // Еще один вопрос: это антипаттерн?
var private_member; // Я вижу приватные свойства так
var init = function(self) {
// конструктор
}
// Публичные методы
self.someMethod = function(params) {
// Метод
}
// --- //
init(self); // вызов конструктора
}
var bar = new foo(params);
bar.someMethod(...);
В чем ужас подобного подхода? Везде, где я смотрю и читаю, я вижу такое:
function foo() {
var privateMember;
this.publicMember = false;
}
foo.prototype.method = function(a) {
// метод
};
var bar = new foo();
b.method(...);
Почему так? Имхо, читабельность ниже. |
Цитата:
|
devote,
о, спасибо. Честно говоря я все еще немного запутываюсь в этих прототипах. Я так понимаю, что foo.prototype - это базовый объект Function? То есть мы добавляем методы к Function() ? И насчет антипаттерна self = this можете что-либо сказать? |
Цитата:
|
oneguy,
Я пишу var self = this; для того, чтобы можно было вызывать методы этого класса внтури, например, jQuery.each, т.к. там this переопределяется.
self.someMethod = function() {};
self.someEach = function() {
jQuery.each(domObjects, function(i, obj) {
self.someMethod();
});
}
|
Цитата:
|
Цитата:
foo.prototype.someEach = function() {
var self=this;
jQuery.each(domObjects, function(i, obj) {
self.someMethod();
});
};
Вместо var self=this; можно использовать ещё другой подход - с помощью метода Function.prototype.bind.
foo.prototype.someEach = function() {
jQuery.each(domObjects, function(i, obj) {
this.someMethod();
}.bind(this));
};
|
oneguy,
Жаль, что так громоздко получается =( Постоянные bind или self = this в каждом методе почти. Да и читабельность ухудшится, если где-то this в методах, где-то self.. Других способо конструировать объекты нет? |
Цитата:
|
Цитата:
foo.prototype.someEach = function() {
jQuery.each(domObjects, foo.prototype.someMethod.bind(this));
};
|
| Часовой пояс GMT +3, время: 21:30. |