private vs public
Хочется сделать private переменные с возможностью наследования, но я не знаю как.. Вот какая есть идея:
function Car(speed) { // локальная переменная speed } Car.prototype.getSpeed = function() { return speed; } var car = new Car(100); car.getSpeed();//undefined, так как переменная speed не видна прототипу Как реализовать private переменную с public методами get и set, потипу как в других языках программирования (Java, C++) ? Желательно через прототипы конечно же. |
Цитата:
http://www.ozon.ru/context/detail/id/6287517/ там всё. и ответы на прежде заданные вопросы и на те что ещё попытаетесь задать... |
используй это
https://github.com/Livanderiamarum/O...ster/README.md п.с. а можно вопрос, зачем тебе приватные нужны? то есть покажи пример их использования, мне просто интересно |
Цитата:
function Car(speed) { // локальная переменная speed this.getSpeed = function() { return speed; } } Я правильно понял? |
Цитата:
|
function Car(speed) { var a=10; this.getSpeed=function(){ return a}; this.setSpeed=function(){ a=20}; } var car = new Car(100); alert(car.getSpeed()) car.setSpeed() alert(car.getSpeed()) |
Цитата:
function Cat (){ this._protected = 10; this.public = function(){ alert( this._protected ) } } |
Цитата:
Пример: кот , у кота есть имя. Можно было бы записать кот.имя чтобы его получить, но исходя из логики запроса нам надо просто получить имя: нужен публичный метод "получитьИмя". Причем внутри метода возможно будет "своя" специфичная логика (может получиться так, что нужно не просто вернуть имя внутри метода, но и инициализировать какую нибудь переменную, например). Вобщем, инкапсуляция нужна в ООП. |
Цитата:
|
Drimogemon,
а сам то ты кто? нуб неадекватный. сколько уже твоих аков здесь забанили? |
ХВАТИТ ЭТО ТЕРПЕТЬ
|
TO Drimogemon:
В вашем примере используется this, что делает свойства Cat'a public (они же теперь открыты всем объектам). PROTECTED похоже в Javascript совсем нет и вроде это не реализовать никак (возможно, я ошибаюсь). |
Так, видно придется пересылать копипаст сюда. http://javascript.ru/forum/184083-post1.html
Цитата:
|
Цитата:
function Car(speed) { var a=10; this.getSpeed=function(){ return a}; this.setSpeed=function(){ a=20}; } var car = new Car(100); alert(car.getSpeed()) car.setSpeed() alert(car.getSpeed()) alert(car.a) |
almac,
то есть ты либо совсем не понимаешь че такое модификаторы доступа и зачем они нужны, либо притворяешься. если не понмиаешь то я могу обьяснить своими словами. dmitriymar, теперь сделай мне с этим дерьмом наследование? п.с. вот сахарная обертка на ооп в javascript https://github.com/Livanderiamarum/O...ster/README.md |
Цитата:
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя. ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА |
Цитата:
Само собой, если переменная только для чтения, то используем простой геттер, и просто НЕОБХОДИМО использовать "скрытие" переменной. Если же можно использовать и геттер, и сеттер, то тут вроде можно и не писать эти "лишние" методы get и set, но это правило хорошего тона. |
almac,
инкапсуляция в javascript достигается пространством имен _ и люди знают что если свойство начинается с _ то оно внутреннее. обычно даже итерируют свойства так: for ( key in obj ) if( key.indexOf('_') !== 0 ){ } (если итератор не поедусмотрен интерфейсом обьекта конечно) Конструкторы же объектов принято называть с Заглавной буквы. Javascript очень динамичный язык(хорошо это или нет), по этому в нем много возможностей и много договоренностей. Цитата:
|
Цитата:
|
TO Drimogemon: ну и зачем вы так с людьми? не надо нас так люто ненавидеть... я про все ваши сообщения, которые не касаются javascript
|
almac,
это его шестая или более попытка прижиться на форуме,все прежние под бан попадали-так что его бан это вопрос времени. |
Цитата:
Цитата:
п.с. еще раз повторюсь ВОТ лучшая реализация ООП на javascript https://github.com/Livanderiamarum/O...ster/README.md лучшая по всем параметрам |
В Джаваскрипте нет собственной поддержки приватных методов.
В примере dmitriymar'а приватные переменные определяются внутри конструктора. При этом они недоступны снаружи конструктора, однако, на мой взгляд, в этом подходе есть недостаток: все методы, которые должны иметь доступ к приватным переменным, должны создаваться для каждого экземпляра класса вместо одного метода в прототипе. Поэтому подход Drimogemon'а кажется мне более рациональным: использовать определённые конвенции для отделения приватных и публичных методов, например имена приватных методах начинать с символов "_". |
oneguy,
неужто вы думаете что существует один шаблон наследования? Выбор большой шаблонов и у каждого свои возможности |
Ещё не забывайте, что в Джаваскрипте есть собственная поддержка свойств доступа. Поэтому вместо этого:
function Car(speed) { this._speed=speed; } Car.prototype.getSpeed=function () { alert("Скорость: "+this._speed); return this._speed; }; Car.prototype.setSpeed=function (v) { this._speed=v; alert("Скорость установлена на "+v); }; var car = new Car(100); car.setSpeed(car.getSpeed()+1) гораздо удобнее работать с этой реализацией Car: function Car(speed) { this._speed=speed; } Car.prototype={ get speed() { alert("Скорость: "+this._speed); return this._speed; }, set speed(v) { this._speed=v; alert("Скорость установлена на "+v); } }; var car = new Car(100); car.speed++; |
Цитата:
|
Цитата:
Да вы даже посмотрите как обьекты созданные классами выгладят в консоли, МАКСИМАЛЬНАЯ ОПТИМИЗАЦИЯ, использование делегации НА ВСЮ КАТУШКУ. https://github.com/Livanderiamarum/O...ster/README.md |
Цитата:
Вот если Вы сделаете у себя виджеты-интерфейсы UI и какуюто страницу примеров с такими базовыми классами как окна табы слайдеры итд только тогда можно сравнивать и говорить чье лучше А пока по вашим программам даже сказать нечего-все на очень ранней стадии и возможно из этой стадии и выходить не собирается |
Цитата:
|
Цитата:
|
Цитата:
|
vadim5june,
создать классы для работы с HTML :p |
Цитата:
а он не хочет |
vadim5june,
пускай создает=) |
Цитата:
Щас смотрю, и ведь действительно ни одной нет. Проглядел.., спасибо добавим. ![]() Цитата:
каким образом это вообще должно быть связанно с чем-то кроме наследования на javascript ? Ты вообще понимаешь что такое ООП что такое идеома и что такое паттерн и что такое фреймворк? |
как мы понимаем суть классов это повторное использование кода, в классе Виджет я описываю логику построения всех виджетов, в дочерних классах Кнопка и Лампа, я описываю только свойственную им логику, а логику построения виджета наследую от класса Виджет. КЭП.
<body></body> <script> var Widget = new Class( function ( parent ) { this.HTMLElement = null; this.__construct = function ( w, h, color ) { this.HTMLElement = document.createElement( 'div' ); this.HTMLElement.style.position = 'relative'; this.HTMLElement.style.width = w + 'px'; this.HTMLElement.style.height = h + 'px'; this.HTMLElement.style.backgroundColor = color; document.body.appendChild( this.HTMLElement ); }; } ); var Button = new Class( Widget, function ( parent ) { this.action = null; this.onclick = function () {if ( this.action )this.action()}; this.__construct = function ( w, h, color ) { parent.__construct.call( this, w, h, color ); this.HTMLElement.onclick = this.onclick.bind( this ); }; } ); var Lamp = new Class( Widget, function ( parent ) { this.state = false; this.onColor = ''; this.offColor = ''; this.toggle = function () { this.state = !this.state; this.HTMLElement.style.backgroundColor = this[this.state ? 'onColor' : 'offColor']; }; this.__construct = function ( size, onColor, offColor ) { parent.__construct.call( this, size, size, offColor ); this.HTMLElement.style.borderRadius = size / 2 + 'px'; this.onColor = onColor; this.offColor = offColor; }; } ); var lamp = new Lamp( 100, '#ccc', '#444' ); var button = new Button( 100, 50, '#040' ); button.action = lamp.toggle.bind( lamp ); // собственно сама функция которая позволяет вытворять все эти чудеса function Class( a, b ) { var description = b ? b : a; var superClass = b ? a : b; var constructor = function () {if ( this['__construct'] )this['__construct'].apply( this, arguments )}; description.prototype = Object.create( superClass ? superClass.prototype : Class.base ? Class.base.prototype : Object.prototype ); constructor.prototype = new description( description.prototype ); return constructor; } </script> |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 02:23. |