Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Классы в javascript? (https://javascript.ru/forum/misc/25651-klassy-v-javascript.html)

Mахmахmахimus 11.02.2012 20:09

Классы в javascript?
 
function Cat() {
	var private = Object.create(arguments.callee.prototype), public = Object
	        .create(private), arg = [ private, public ];
	for ( var i = 0; i < arguments.length; i++) {
		arg.push(arguments[i])
	}
	return arguments.callee.init.apply(this, arg)
}
Cat.addMethod = function(name, call) {
	this.prototype[name] = function() {
		var self = this.__proto__, private = self;
		this.__proto__ = Cat.prototype;
		self.__proto__ = this;
		var arg = [ self, private, this ]
		for ( var i = 0; i < arguments.length; i++) {
			arg.push(arguments[i])
		}
		call.apply(this, arg)
		self.__proto__ = Cat.prototype;
		this.__proto__ = self;
	}
}

Cat.init = function(private, public) {
	// приватные свойства каждой сущности
	private.name = 'приватное имя'

	// публичные свойства каждой сущности
	public.age = 'публичный возраст'

	return public
}

// добавляем метод
Cat.addMethod('sayName', function(self, private, public) {
	alert(self.name)
})
// добавляем метод
Cat.addMethod('setName', function(self, private, public, name) {
	private.name = name
	public.age = '200 лет'
})

//создаем кота
var cat = Cat();
//проверяем как зовут
cat.sayName(); //приватное имя
//меняем приватное имя к которому имеют доступ только методы, по этому через метод
cat.setName('Даша');
//проверяем как его теперь зовут
cat.sayName(); //Даша

//создаем публичное свойство name
cat.name = "Афанасий"
//проверяем что методами используется по прежнему приватное имя
cat.sayName(); //Даша

ура, классы работают!
Теперь надо создать класс классов)!!!

Nekromancer 11.02.2012 20:10

Mахmахmахimus,
нет на тебя Валеры ...

Mахmахmахimus 11.02.2012 20:14

self - все свойства сущности, сначала ищутся приватные потом публичные
private - сюда добавляются приватные свойства
public - сюда добавляются публичные свойства

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

Mахmахmахimus 11.02.2012 21:24

Все таки я сделал это)) осталось только как то подправить код) и сделать чтобы было красиво и не тупило.
Может придумать класс классов)?

Mахmахmахimus 11.02.2012 22:19

У меня вопрос, публичные методы могут иметь доступ приватным свойствам сущности?
Так же у меня вопрос, есть наверное какие-то либы с классами я как полагаю меня посетила мысль что я пишу велосипед)?

Shaci 11.02.2012 22:30

Цитата:

Сообщение от Mахmахmахimus (Сообщение 156838)
У меня вопрос, публичные методы могут иметь доступ приватным свойствам сущности?
Так же у меня вопрос, есть наверное какие-то либы с классами я как полагаю меня посетила мысль что я пишу велосипед)?

забей на классы болт, сходи пивка попей)

Mахmахmахimus 11.02.2012 22:34

Цитата:

Сообщение от Shaci
забей на классы болт, сходи пивка попей)

А фраза то крылатая)

Octane 11.02.2012 22:53

Цитата:

Сообщение от Mахmахmахimus
У меня вопрос, публичные методы могут иметь доступ приватным свойствам сущности?

Да. А вообще возьми да попробуй!
Код:

#include <iostream>

class MyClass
{
        public:
                void set(int x)
                        {
                                this->x = x;
                        }
                void show()
                        {
                                std::cout << this->x << std::endl;
                        }
        private:
                int x;
};

int main()
{

        MyClass obj;
        obj.set(5);
        obj.show();

        return 0;

}

http://codepad.org/Qd3Ezpdx

Mахmахmахimus 11.02.2012 23:07

Цитата:

Сообщение от Octane
Да. А вообще возьми да попробуй!

хах) неет, я спрашиваю как мне делать нужно чтобы имели или чтобы нет)
А мне вот кажется что не должны, иначе теряется смысл приватности.

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

вот если внутри класса опишу публичные методы, то да, они будут иметь доступ)

Octane 11.02.2012 23:31

Не знаю, посмотри, как это работает, например, в ActionScript

Mахmахmахimus 11.02.2012 23:54

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

Octane 12.02.2012 00:00

Не знаю ActionScript, в C++ классы статичны, ничего "потом" добавить не получится

Mахmахmахimus 12.02.2012 00:07

Цитата:

Сообщение от Octane
в C++ классы статичны, ничего "потом" добавить не получится

Шикарно)! значит у нас получатся протоклассы)!

попробую даже сделать без __proto__

FINoM 12.02.2012 00:33

Где наследование? Где статичные объекты?

FINoM 12.02.2012 00:34

Ну и, соответственно, protected.

Mахmахmахimus 12.02.2012 00:36

Цитата:

Сообщение от FINoM
Где наследование? Где статичные объекты?


что такое статичные обьекты?

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

var Cat = Class(function Cat() {
	this.private({
	    a : 20,
	    spead : 20
	})
	this.protected({

	})
	this.public({

	})
	this.static({

	})
});


private это то что будут иметь каждое созданное существо персонально для себя при том не видное снаружи

protected пока сам не понял до конца что это

public это аналог слова this в обычных конструкторах, у каждого существа будут личные публичные свойства.

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

вопрос, какие еще штуки добавить?
еще вопрос, публичные методы должны иметь доступ к приватным свойствам?

FINoM 12.02.2012 00:41

Цитата:

Сообщение от Mахmахmахimus
что такое статичные обьекты?

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

Mахmахmахimus 12.02.2012 00:46

это как prototype по сути? Общие на всех свойства.

monolithed 12.02.2012 01:01

Цитата:

Сообщение от Octane
в C++ классы статичны, ничего "потом" добавить не получится

Теоретически можно создать фабрику объектов через шаблоны в связке со smart pointer's. В этом случае можно получить новый объект в рантайме, а само назначение имени объекта будет иметь вид new Class('Foo')

Цитата:

Сообщение от Mахmахmахimus
static это как прототип

Не совсем, это свойство доступное в пределах класса, т.е. к нему можно обращаться как глобальному объекту, но за пределами класса оно не доступно.

Цитата:

Сообщение от http://msdn.microsoft.com/ru-ru/library/f4ewhdb8.aspx
Модификатор static указывает, что член класса принадлежит самому классу, а не его экземпляру. Даже если в отдельном приложении создается множество экземпляров класса, в нем существует только одна копия члена с модификатором static. При доступе к члену с модификатором static следует ссылаться на класс, на не на его экземпляр. Однако в рамках объявления члена класса к членам static можно обращаться с помощью объекта this.

Модификатором static можно помечать члены классов. Классы, интерфейсы и члены интерфейсов не могут иметь модификатора static.

Цитата:

Сообщение от Mахmахmахimus
Кстати может ты знаешь, допустим ты описал класс, потом создал им кота, потом добавляешь в класс новые протект методы, начнет ли их иметь уже созданный кот?

Ну и нафига это? Мне кажется ты путаешь с полиморфизмом:

#include <iostream>
#include <string>

using namespace std;
 
class A {};
class B {};

template <typename T> class Foo {};

template <> class Foo <A>
{
	public:
		void get() {
			cout << "Class A" << endl;
		}
};

template <> class Foo <B>
{
	public:
		void get() {
			cout << "Class B" << endl;
		}
};


int main() {
	Foo<A> a;
	Foo<B> b;

	a.get(); //Class A
	b.get(); //Class B

	return 0;
}


http://codepad.org/cgzfHj9X

Mахmахmахimus 12.02.2012 01:09

//создание создавателя классов
(function(name) {
	init = {}
	init.class = {}

	init.private = function() {

	}
	init.protected = function() {

	}
	init.public = function() {

	}
	init.static = function() {

	}

	window[name] = function Class(class) {
		init.class = {} //очищаем кастрюлю от предыдущего "сваренного" класса
		class.call(init)
		return init.class
	}
})('Class')

//пример создания класса
var Cat = Class(function Cat() {
	this.private({
	    a : 20,
	    spead : 20
	})
	this.protected({

	})
	this.public({

	})
	this.static({

	})
});


вот каркас того что я начал делать, по сути функция Class принимает функцию описывающую класс, каким образом? вызывая определенные методы относительно this и суя с них обьекты.

так вот фунция Class принимает эту функцию и вызывает относительно обьекта init который хранится в её замыкании, методы в этом init что-то делают с полученнынми обьектами, наполняя свойство init.class создавая там функцию фабрику класса.

потом функция Class просто возвращает полученное там init.class значение))
правда init.class придется очищать перед каждый созданием класса потому что в нем будет хранится ссылка на предыдущий созданный класс, но это мелочи)) это как кастрюлю после варки помыть.

Mахmахmахimus 12.02.2012 01:47

Короче я ни хрена не понимаю как работают остальные свойства, сделаю пока приватные и публичные

Shaci 12.02.2012 02:02

Цитата:

Сообщение от Mахmахmахimus (Сообщение 156865)
protected пока сам не понял до конца что это

тоже самое что private, только можно наследовать в подклассе
тьфу ты, в смысле к этой переменной можно обращаться из подкласса

Mахmахmахimus 12.02.2012 03:41

Цитата:

Сообщение от Shaci
в смысле к этой переменной можно обращаться из подкласса

блин и как мне это сделать)?

FINoM 12.02.2012 05:12

Цитата:

Сообщение от Mахmахmахimus
блин и как мне это сделать)?

Только ты тут проявляешь инициативу. Я думаю что-то придумать можно.

FINoM 12.02.2012 05:28

Для devote делал скрин, который сохранился на сервере. Может, это и бред.



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

Mахmахmахimus 12.02.2012 05:49

FINoM,
Не, у меня поудобней будет, только вот у меня вопрос,
вначале обьясню как работает.
Внутри методов есть слово this , оно означает нашу сущность, с нем находятся свойства , в каком порядке должен производится поиск? сначала в публичных потом в приватных потом в протекторных и.т.п.?
в каком порядке?

FINoM 12.02.2012 06:06

Mахmахmахimus, что-то ничего удобного я у тебя не увидел. Где наследование — самое главное?
Цитата:

Сообщение от Mахmахmахimus
в каком порядке должен производится поиск? сначала в публичных потом в приватных потом в протекторных и.т.п.?

Я не знаком с ооп в других языках, отталкиваюсь только от логики: сначала приватные, потом протекторные, а затем уже публичные. Это, вроде как, называется полиморфизмом (?)

Mахmахmахimus 12.02.2012 06:17

Цитата:

Сообщение от FINoM
сначала приватные, потом протекторные, а затем уже публичные.

отлично, спасибо так и сделаем!

protected общая для всех сущностей класса?

FINoM 12.02.2012 06:37

Цитата:

Сообщение от Mахmахmахimus
protected общая для всех сущностей класса?

Протектед не виден вне класса. Это типа привата, только виден дочерним конструкторам.

Mахmахmахimus 12.02.2012 06:40

Цитата:

Сообщение от FINoM
Протектед не виден вне класса. Это типа привата, только виден дочерним конструкторам.

protected общая для всех сущностей класса?
п.с. и что значит не виден вне класса? что такое класс тогда? (да я задаю такой вопрос)

FINoM 12.02.2012 07:06

Я не знаю, как по-другому объяснить.

Mахmахmахimus 12.02.2012 14:56

Класс это функция которая будет генерить новые объекты.

Private это свойство которое создается каждый раз и засовывается в носовоздаваемого ребенка. если написать дете.имяПриватСвойства то приват свойство не обнаружится, в этом его суть! Видно это свойство ТОЛЬКО методам запущенным относительно этого ребенка через точку При том если эти методы былыи описаны в классе!

Public это свойство которое создается каждый раз для каждого ребенка и засовывается в него напрямую через точку. Методы засунутые туда, так же будут иметь доступ к его приватным свойствам и прочей внутренней херне. при том эти методы и свойства ДОСТУПНЫ снаружи через точку дете.имяПубликСвойства

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


вопрос, что такое protect?
исходя из информации на сайтах и ту что вы мне дали я понял что это

Protect свойство которое че-то там наследование (я еще пока даже делать не думаю) и.т.п. оно мне пока не нужно, потом как буду делать наследование будем протект добавлять. пока сделаю просто классы

Mахmахmахimus 12.02.2012 15:53

Классы можно сделать наследниками как классов так и уже созданных детей? я правильно понимаю?

FINoM 12.02.2012 23:53

Цитата:

Сообщение от Mахmахmахimus
Классы можно сделать наследниками как классов так и уже созданных детей? я правильно понимаю?

Я думаю, лучше всего, прочесть ман и поковырять другой язык. Реализовывать классы по советам — не вариант.

Mахmахmахimus 13.02.2012 00:02

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

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

Mахmахmахimus 14.02.2012 04:22


Mахmахmахimus 14.02.2012 04:26

Если внутри метода обратится к this.prop
то prop будет сначала искаться в __private__ потом в __static__ потом в __public__

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

this.public.prop

или

this.private.prop

this.static.prop

добавлять свойства можно так же

this.static.prop = 300 //и у всех котов появится свойство prop равное 300

ЕДИНСТВЕННЫЙ косяк, если нужно добавить МЕТОД изнутри другого метода, то нужно писать не так
this.private.prop = function(){}

а так

this.private("prop", function(){})

ТОЛЬКО ТАК вновь добавленные методы смогут работать с уже созданными обьектами.

Но в новом javascript Используя прокси я этот гемор устраню))

Mахmахmахimus 16.02.2012 02:18

Вопрос, я не должен мочь обращаться к статик свойству вот так
cat.staticProp ???

Иными словами static это ОБЩИЕ приватные свойства сущностей?

Octane 16.02.2012 02:46

В JavaScript это будет всего-лишь свойство самого конструктора

Mахmахmахimus 16.02.2012 02:51

Цитата:

Сообщение от Octane
В JavaScript это будет всего-лишь свойство самого конструктора

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


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