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, время: 06:30. |