Классы в 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(); //Даша ура, классы работают! Теперь надо создать класс классов)!!! |
Mахmахmахimus,
нет на тебя Валеры ... |
self - все свойства сущности, сначала ищутся приватные потом публичные
private - сюда добавляются приватные свойства public - сюда добавляются публичные свойства Есть идеи как убрать вот эти страшные некрасивые куски кода и не писать их каждый раз? |
Все таки я сделал это)) осталось только как то подправить код) и сделать чтобы было красиво и не тупило.
Может придумать класс классов)? |
У меня вопрос, публичные методы могут иметь доступ приватным свойствам сущности?
Так же у меня вопрос, есть наверное какие-то либы с классами я как полагаю меня посетила мысль что я пишу велосипед)? |
Цитата:
|
Цитата:
|
Цитата:
Код:
#include <iostream> |
Цитата:
А мне вот кажется что не должны, иначе теряется смысл приватности. То есть если я в уже созданного кота добавлю какой то метод через точку, то с какого хрена он вообще будет иметь доступ к его приватным свойствам??? вот если внутри класса опишу публичные методы, то да, они будут иметь доступ) |
Не знаю, посмотри, как это работает, например, в ActionScript
|
Кстати может ты знаешь, допустим ты описал класс, потом создал им кота, потом добавляешь в класс новые протект методы, начнет ли их иметь уже созданный кот?
|
Не знаю ActionScript, в C++ классы статичны, ничего "потом" добавить не получится
|
Цитата:
попробую даже сделать без __proto__ |
Где наследование? Где статичные объекты?
|
Ну и, соответственно, protected.
|
Цитата:
что такое статичные обьекты? п.с. вопрос, вот так описывать класс удобно будет? var Cat = Class(function Cat() { this.private({ a : 20, spead : 20 }) this.protected({ }) this.public({ }) this.static({ }) }); private это то что будут иметь каждое созданное существо персонально для себя при том не видное снаружи protected пока сам не понял до конца что это public это аналог слова this в обычных конструкторах, у каждого существа будут личные публичные свойства. static это как прототип, существ, все static свойства будут доступны всем существам и будут общими на всех, если добавить в прототип новое свойство, то оно автоматически появится у всех существ. вопрос, какие еще штуки добавить? еще вопрос, публичные методы должны иметь доступ к приватным свойствам? |
Цитата:
|
это как prototype по сути? Общие на всех свойства.
|
Цитата:
Цитата:
Цитата:
Цитата:
#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 |
//создание создавателя классов (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 придется очищать перед каждый созданием класса потому что в нем будет хранится ссылка на предыдущий созданный класс, но это мелочи)) это как кастрюлю после варки помыть. |
Короче я ни хрена не понимаю как работают остальные свойства, сделаю пока приватные и публичные
|
Цитата:
тьфу ты, в смысле к этой переменной можно обращаться из подкласса |
Цитата:
|
Цитата:
|
Для devote делал скрин, который сохранился на сервере. Может, это и бред.
![]() Конечно, нужно поменять зарезервированные слова на другие. |
FINoM,
Не, у меня поудобней будет, только вот у меня вопрос, вначале обьясню как работает. Внутри методов есть слово this , оно означает нашу сущность, с нем находятся свойства , в каком порядке должен производится поиск? сначала в публичных потом в приватных потом в протекторных и.т.п.? в каком порядке? |
Mахmахmахimus, что-то ничего удобного я у тебя не увидел. Где наследование — самое главное?
Цитата:
|
Цитата:
protected общая для всех сущностей класса? |
Цитата:
|
Цитата:
п.с. и что значит не виден вне класса? что такое класс тогда? (да я задаю такой вопрос) |
Я не знаю, как по-другому объяснить.
|
Класс это функция которая будет генерить новые объекты.
Private это свойство которое создается каждый раз и засовывается в носовоздаваемого ребенка. если написать дете.имяПриватСвойства то приват свойство не обнаружится, в этом его суть! Видно это свойство ТОЛЬКО методам запущенным относительно этого ребенка через точку При том если эти методы былыи описаны в классе! Public это свойство которое создается каждый раз для каждого ребенка и засовывается в него напрямую через точку. Методы засунутые туда, так же будут иметь доступ к его приватным свойствам и прочей внутренней херне. при том эти методы и свойства ДОСТУПНЫ снаружи через точку дете.имяПубликСвойства Static это общее свойство для всех детей, если создать детеныша, изменить у него статик совойство, потом создать нового детеныша, то у нового это статик свойство тоже будет заменено! Статик свойства не доступны через точку снаружи дете.имяСтатикСвойства но доступны всем методам вызванным относительно ребенка если они были описаны в классе. вопрос, что такое protect? исходя из информации на сайтах и ту что вы мне дали я понял что это Protect свойство которое че-то там наследование (я еще пока даже делать не думаю) и.т.п. оно мне пока не нужно, потом как буду делать наследование будем протект добавлять. пока сделаю просто классы |
Классы можно сделать наследниками как классов так и уже созданных детей? я правильно понимаю?
|
Цитата:
|
ну я подумал я проще сделаю как мне кажется будет удобным и логичным, а потом просто буду переделывать что скажут, чтобы другим было привычней и удобней, пока вроде получается, седня ближе к 4 утра выложу код наверное.
пока все сделал через замыкания, но это не дает возможность добавлять новые методы которые получат достууп к тому что в замыканиях. по этому думаю как бы покрасивее все это упаковать без замыканий) |
![]() |
Если внутри метода обратится к 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 Используя прокси я этот гемор устраню)) |
Вопрос, я не должен мочь обращаться к статик свойству вот так
cat.staticProp ??? Иными словами static это ОБЩИЕ приватные свойства сущностей? |
В JavaScript это будет всего-лишь свойство самого конструктора
|
Цитата:
|
Часовой пояс GMT +3, время: 19:24. |