Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Наследование (https://javascript.ru/forum/misc/9737-nasledovanie.html)

Kein 03.06.2010 18:01

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

Kolyaj 03.06.2010 18:05

В JS нет приватных атрибутов.

Gvozd 03.06.2010 18:07

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

и ради интереса, как вы сделали приватный атрибут?

PS чуть-чуть опоздал

micscr 03.06.2010 18:09

Цитата:

Сообщение от Kolyaj (Сообщение 57755)
В JS нет приватных атрибутов.

а замыкания в конструкторе - разве не оно ?

Kein 03.06.2010 18:12

Как раз таки я про замыкание в конструкторе

Kolyaj 03.06.2010 18:16

Цитата:

Сообщение от micscr
а замыкания в конструкторе - разве не оно ?

Это не приватные свойства, а локальные переменные.

И да, такой подход -- зло.

Kein 03.06.2010 18:26

Это может быть излишняя бесполезная осторожность, но почему зло?

Kolyaj 03.06.2010 18:28

Потому что для каждого объекта создаётся своя коллекция методов.

B~Vladi 03.06.2010 18:31

Kolyaj, может есть другой вариант? Не всегда хочется выставлять наружу некоторые свойства...

Kolyaj 03.06.2010 18:33

B~Vladi,
ну называй ты приватные свойства с _. Переопределит кто-нибудь его, кому он хуже-то сделает? Себе только, у него работать перестанет. Я вообще здесь проблемы не вижу.

B~Vladi 03.06.2010 18:40

Цитата:

Сообщение от Kolyaj
Себе только, у него работать перестанет.

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

Kolyaj 03.06.2010 18:43

Цитата:

Сообщение от B~Vladi
Просто иногда хочется сделать такое апи, чтобы ничего лишнего не торчало.

Ну что значит не торчало? Что изменится от того, что будет торчать?

Цитата:

Сообщение от B~Vladi
что для объектов дублирование методов есть большое зло

Так не единственное. Наследование, как видишь, тоже не реализовать нормально.

Не надо привносить классовую идеологию в JavaScript, и тогда никаких проблем не будет.

Kein 03.06.2010 18:44

Методы в конструкторе создавать это да, некрасиво, а вот свойства бывает охота для красоты кода и правильности)

Kolyaj 03.06.2010 18:45

Цитата:

Сообщение от Kein
а вот свойства бывает охота для красоты кода и правильности)

А свойства и должны в конструкторе определяться, иначе они будут общими для всех объектов, порождаемых этим конструктором. Только не надо путать свойства с локальными переменными, лежащими в конструкторе.

B~Vladi 03.06.2010 20:17

Цитата:

Сообщение от Kolyaj
Ну что значит не торчало? Что изменится от того, что будет торчать?

Вот хочется мне чтобы не "торчало", что поделать? Ненужно оно там совсем.

vflash 04.06.2010 00:42

создаете обьект как свойство вашего обьекта (к примеру this._privat={}) и туда все что не должно глаза мозолить. можете сделать перекрестную ссылку на ваш обьект если будет нужно.
или как уже упоминалось obj._eee или obj['~eee']

B~Vladi 04.06.2010 02:15

Всё равно торчит.

with-love-from-siberia 04.06.2010 11:59

B~Vladi,
Можно создавать в конструкторе единственный метод, который будет возвращать ссылку на приватные свойства. По сути - тоже самое, что предлагает vflash, но свойства не торчат. Вернее торчит один единственный метод, который имеет доступ к приватным свойствам.
function MyClass()
{
	var self = this;

	var privates = {};

	self.getPrivates = function()
	{
		return privates;
	};
};

MyClass.prototype.setX = function(x)
{
	return this.getPrivates().x = x;
};

MyClass.prototype.getX = function()
{
	return this.getPrivates().x;
};

vflash 04.06.2010 12:29

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

Цитата:

Сообщение от B~Vladi
Всё равно торчит.

ну и пусть торчит. проблема высосана из пальца

B~Vladi 04.06.2010 12:36

Цитата:

Сообщение от with-love-from-siberia
Можно создавать в конструкторе единственный метод, который будет возвращать ссылку на приватные свойства. По сути - тоже самое, что предлагает vflash, но свойства не торчат. Вернее торчит один единственный метод, который имеет доступ к приватным свойствам.

Я так и делаю.
Цитата:

Сообщение от vflash
ну и пусть торчит. проблема высосана из пальца

Это API, а не проблема.

B~Vladi 04.06.2010 12:37

with-love-from-siberia, всегда хотел проверить. Если вызывать функцию как конструктор, для неё сознаётся отдельный scope? Надо будет попробовать.

with-love-from-siberia 04.06.2010 12:41

Цитата:

и какой толк в функции getPrivates
Так я и говорю:
Цитата:

По сути - тоже самое
Но нам говорят
Цитата:

Это API

B~Vladi 04.06.2010 12:52

:D Мега-ацкое-апи


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