Правильное оформление объекта
Встала необходимость освоить 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, время: 08:26. |