[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП
Mirexzpalich
Начал приучаться к ООП в JavaScript и сразу же столкнулся с проблеммой...
Ни как не выходит приручить выполняться такие конструкции:

var a = new Class();
a.fn1(3).fn2(6).fn3(7)....

т.к. fn1 возвращает число, то fn2 уже получается должен быть методом числа, а мне необходимо, что выполнялся метод "класса" Class
Как быть?



Спустя 59 минут, 34 секунды (3.09.2011 - 13:22) moskitos80 написал(а):

function Obj(val) {

'use strict';

return {

value : val,

add : function (v) {

this.value += v;
return this;
},

subtract : function (v) {

this.value -= v;
return this;
},

traceVal : function () {

alert(this.value);
}

}
;
}

var obj = new Obj(10);

obj.add(10).subtract(5).traceVal(); // Всплывёт окно со значением "15"


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

Спустя 1 час, 45 секунд (3.09.2011 - 14:23) Mirexzpalich написал(а):
Это понятно. Но!
допустим я хочу сделать так:

obj.add(10) - чтоб вернуло 10
следующей строчкой
obj.add(10).add(5) - чтоб вернуло 15
obj.add(10).subtract(5).traceVal(); - вывело 15...

Примено как это работает в JQUERY
$('#div') - вернет элемент
$('#div').attr('id') - вернет id, но и
$('#div').id вернет id...

Меня интересует как раз такая реализация. Может просто кто посоветует почитать что-то где-то...

Спустя 3 часа, 15 минут, 11 секунд (3.09.2011 - 17:38) moskitos80 написал(а):
Ты наверно немного не понимаешь, что означает выражение $('#div') это вообще функция обёртка которая возвращает объект jQuery, у которого естественно, можно вызывать методы. И в цепочку можно сцеплять только те методы, которые возвращают объекты, но есть одно "но"...

В Javascript - всё объекты! Если функция возвращает примитивный тип данных, то работать с ним можно как с объектом (!) - Javascript временно преобразует его в объект, соответствующего типа, и да, можно будет вызывать методы этого объекта-обёртки. Можно так же расширить объекты - обёртки для примитивных типов (String, Number и т.п. ) через свойство prototype, но в данном случае это не совсем то.

Чуть поясню про $('#div'). Не всё, что возвращает вызов $('#div') есть объект jQuery:

$('#div').attr('id') - возвращает примитивный тип данных - строку. и к нему можно прицепить только методы объекта String например так:

$('#div').attr('id').toUpperCase() не более.

А вот $('#div').id - вернёт "undefined" потому что у объекта jQuery нет открытого свойства id, а есть закрытое и метод - аксессор: attr('id'), для доступа к этому закрытому свойству.

Кстати в Javascript только "NULL" и "undefined" не имеют Объектов обёрток.

В общем, если ты хочешь строить цепочку из методов и одновременно из этих же методов получать примитивные типы данных - расширяй Объекты - обёртки этих типов через свойства prototype. По другому вряд ли. Но тут есть минус - это уже не будут методы твоего, вроде как класса: Class (как ты написал в первом посте)

Кстати идея построение объектов, методы которых можно выстраивать в цепочку, так и называется "Паттерн цепочка" - конечно в контексте Javascript. Его реализацию я привел тебе в первом посте. jQuery его кстати и использует.

Спустя 2 часа, 30 минут, 38 секунд (3.09.2011 - 20:09) Guest написал(а):
Другими словами, точка это обращение к методу в объекте!, а какой же метод у числа например 15, если оно не объект и в нём нет ничего.

Спустя 4 минуты, 2 секунды (3.09.2011 - 20:13) Гость_Greg1978 написал(а):
Цитата (moskitos80 @ 3.09.2011 - 14:38)
Кстати идея построение объектов, методы которых можно выстраивать в цепочку, так и называется "Паттерн цепочка" - конечно в контексте Javascript. Его реализацию я привел тебе в первом посте. jQuery его кстати и использует.

Не не не, паттерн цепочка имеет другой смысл и реализуется от контекста события. В среде JS как и в любом другом ЯП можно использовать цепочку вызовов, но это не будет являться паттерном. Не путайте два разных понятия: паттерн проектирования и методика вызовов.

Спустя 49 минут, 45 секунд (3.09.2011 - 21:02) moskitos80 написал(а):
Цитата (Guest @ 3.09.2011 - 17:09)
Другими словами, точка это обращение к методу в объекте!, а какой же метод у числа например 15, если оно не объект и в нём нет ничего.

В Javascript всё объект, даже число 15 как я уже сказал, если с элементарными значениями обращаться как с объектом, то JS временно преобразует его в объект и у него будут доступны методы.

Конкретно число 15 преобразуется в объект Number у которого есть методы:

toExponential()
toFixed()
toLocaleString()
toPrecision()
toSource()
toString()
valueOf()

А так же свойства. Можете посмотреть в справочнике. Так что даже такая запись:

document.write( 5.123456.toPrecision(2) );


Вполне корректна с точки зрения интерпретатора и выведет вам число 5.1

Гость_Greg1978

Не не не, паттерн цепочка имеет другой смысл и реализуется от контекста события. 
В среде JS как и в любом другом ЯП можно использовать цепочку вызовов, но это не будет являться паттерном.
Не путайте два разных понятия: паттерн проектирования и методика вызовов.


- Ну, по крайней мере Стоян Стефанов - один из разработчиков кампании Yahoo - считает Шаблон "Цепочка" одним из шаблонов создания объектов. О нём я узнал в одной из его книг. Я думаю его авторитет в этой области позволяет ему это утверждать.

Но может Вы и правы, а мы просто не поняли друг друга. Я знаю ещё один шаблон по имени Цепочка, но он реализуется в других объектно-ориентированных языках и не имеет с данным ничего общего. Здесь речь идёт о Javascript.

Спустя 3 часа, 6 минут, 27 секунд (4.09.2011 - 00:09) Mirexzpalich написал(а):
Цитата
А вот $('#div').id - вернёт "undefined"

Неа... Вернет строку "div". Будет работать и такая конструкция
$('#div').style.background = "red";

Протопипирование... тобишь, чтобы работала такая конструкция
"WWWW".toLowerCase().trim()
где trim - некая самописная функция, которая может применяться ко всем объектам. Необходимо прототипировать ее для всех объектов?

Спустя 43 минуты, 25 секунд (4.09.2011 - 00:52) moskitos80 написал(а):
Цитата (Mirexzpalich @ 3.09.2011 - 21:09)
Цитата
А вот $('#div').id - вернёт "undefined"

Неа... Вернет строку "div". Будет работать и такая конструкция
$('#div').style.background = "red";

Протопипирование... тобишь, чтобы работала такая конструкция
"WWWW".toLowerCase().trim()
где trim - некая самописная функция, которая может применяться ко всем объектам. Необходимо прототипировать ее для всех объектов?

Ну да типа того:


String.prototype.trim = function(a) {
// здесь какой то код ...
return this;
}


И.. послушай я когда советую я проверяю код в браузере:

$('#div').id - вернёт "undefined" !

а

$('#div').style.background = "red";

- вообще выдаст ошибку. Ниже листинг скопируй и запусти у себя в браузере и проверь сам.


<!DOCTYPE html>
<html lang="ru-RU">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
Документ без названия</title>

<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<script
type="text/javascript">
$(function(){

console.log( $("#test").style ); // undefined
console.log( $("#test").id ); // undefined

$("#test").style.background = "red"; // Uncaught TypeError: Cannot set property 'background' of undefined

});
</script>
</head>

<body>
<div
id="test">TEST</div>
</body>
</html>


Спустя 13 часов, 15 минут, 20 секунд (4.09.2011 - 14:08) Mirexzpalich написал(а):
moskitos80
Дейстительно...
Хм... А на работе и так я спокойно обращаюсь:
$('#div').style.background = "red";

Наверно кто-то допиливал JQUERY =)
Спасибо. Больше вопросов нет.

Спустя 42 минуты, 14 секунд (4.09.2011 - 14:50) Guest написал(а):
Цитата (moskitos80 @ 3.09.2011 - 18:02)
- Ну, по крайней мере Стоян Стефанов - один из разработчиков кампании Yahoo - считает Шаблон "Цепочка" одним из шаблонов создания объектов. О нём я узнал в одной из его книг. Я думаю его авторитет в этой области позволяет ему это утверждать.

Но может Вы и правы, а мы просто не поняли друг друга. Я знаю ещё один шаблон по имени Цепочка, но он реализуется в других объектно-ориентированных языках и не имеет с данным ничего общего. Здесь речь идёт о Javascript.

Ещё раз повторюсь, цепочка обязанностей это паттерн (заключающаяся в распределении знаний и контекстов), цепочка вызовов это методика скажем так оптимизации кода. Два разных аспекта и они ни как не зависят от языка программирования (ЯП).
Это то же самое сравнивать методику проектирования с методикой программирования. Понятное дело что и тот и другой момент одинаков в порождении объектов но суть их разная так как Компонент и Объект описывают свой уровень. Компонент уровень проектирования, объект уровень программирования и реализации.

Спустя 36 минут, 36 секунд (4.09.2011 - 15:26) moskitos80 написал(а):
Но позвольте - в Javscript нет классов! Следовательно проектирование на их основе не возможно. Есть функции конструкторы, которые могут порождать объекты, позволяющие использовать цепочки вызовов. Вот как раз методику создания таких функций, Стефаноф и назвал шаблоном Цепочка. И насколько я понимаю всю эту кухню, в объектно-прототипированном Javascript шаблоны имеют немного иную ипостась нежели в объектно-ориентированных ЯП.

Спустя 29 минут, 11 секунд (4.09.2011 - 15:56) Guest написал(а):
Цитата (moskitos80 @ 4.09.2011 - 12:26)
Но позвольте - в Javscript нет классов! Следовательно проектирование на их основе не возможно. Есть функции конструкторы, которые могут порождать объекты, позволяющие использовать цепочки вызовов. Вот как раз методику создания таких функций, Стефаноф и назвал шаблоном Цепочка. И насколько я понимаю всю эту кухню, в объектно-прототипированном Javascript шаблоны имеют немного иную ипостась нежели в объектно-ориентированных ЯП.

Позволяю !!!!!!!!!! smile.gif
Тогда в Java Script один единственный шаблон!!!
Цепочка!! ну и понятное дело процедурная метода.
А как же эмуляция !!!! Об неё то забывамс!!

Спустя 7 минут, 4 секунды (4.09.2011 - 16:03) Guest написал(а):
Ещё раз ... !
Цепочка вызовов это не паттерн!!!!
Это свойственное любому объектному! языку методика вызовов. Паттерн, о ужас, это методика проектирования. Паттерн енто есть ШАБЛОН! Если в JS нет классов, хотя есть объекты (которые то же подвержены шаблонам проектирования в данном случае порождающем но ни как ПОВЕДЕНЧЕСКИМ, по крайней мере для этого шаблона), не факт что нет шаблонов, так как классы структурируют в основном да более глубже задают ООП. Цепь вызовов из объектов, ыщо раз не есть паттерн!!!

Спустя 3 минуты, 5 секунд (4.09.2011 - 16:06) Guest написал(а):
Цепочка обязанностей
ознакомьтесь и сравните параллели, простые вызова от объекта к объекту и Что такое паттерн и с чем его едят.

Спустя 49 минут, 48 секунд (4.09.2011 - 16:56) Guest написал(а):
Цитата (Guest @ 4.09.2011 - 13:06)
Цепочка обязанностей
ознакомьтесь и сравните параллели, простые вызова от объекта к объекту и Что такое паттерн и с чем его едят.

Кстати цепочка вызовов методов не обязательно должна быть разных объектов, что ещё больше говорит о том что цепочка это способ (метод) реализации а не проектирования. Реализация ни когда не страдала шаблонами (потому как реализовать шаблон можно обычно несколькими методами и способами)

Спустя 33 минуты, 12 секунд (4.09.2011 - 17:29) moskitos80 написал(а):
Цитата (Guest @ 4.09.2011 - 13:03)
Ещё раз ... !
Цепочка вызовов это не паттерн!!!!
Это свойственное любому объектному! языку методика вызовов. Паттерн, о ужас, это методика проектирования. Паттерн енто есть ШАБЛОН! Если в JS нет классов, хотя есть объекты (которые то же подвержены шаблонам проектирования в данном случае порождающем но ни как ПОВЕДЕНЧЕСКИМ, по крайней мере для этого шаблона), не  факт что нет шаблонов, так как классы структурируют в основном да более глубже задают ООП. Цепь вызовов из объектов, ыщо раз не есть паттерн!!!

Блин ... дословно. Не поленюсь перепечатать из книги (да простит меня автор):

Шаблон цепочек.

Шаблон цепочек предоставляет возможность вызова методов объектов друг за другом без необходимости присваивать предыдущее возвращаемое значение промежуточной переменной и размещать инструкции вызова в нескольких строках:

myobj.method1("hello").method2().method3("world").method4();


При создании методов, не имеющих какого - либо осмысленного возвращаемого значения, можно возвращать из них ссылку this - экземпляр объекта, метод которого был вызван. Это позволит пользователям вашего объекта вызывать следующий метод, объединив его в цепочку с предыдущим:


var obj = {
value: 1,
increment: function () {
this.value += 1;
return this;
},
add: function (v) {
this.value += v;
return this;
},
shout: function () {
alert(this.value);
}
}
;

// цепочка из вызовов методов
obj.increment().add(3).shout(); // 5

// то же самое, но методы вызываются по одному

obj.increment();
obj.add(3);
obj.shout(); // 5


Вы можете объяснить почему автор книги "JavaScript Шаблоны" называет это и другие описанные в ней методики - шаблонами? Быть может я упёрто заблуждаюсь?

Спустя 10 минут, 53 секунды (4.09.2011 - 17:40) Guest написал(а):
Пусть простит Вы этот автор но где Вы видите несколько объектов smile.gif

Шаблон цепочек предоставляет возможность вызова методов объектов друг за другом без необходимости присваивать предыдущее возвращаемое значение промежуточной переменной и размещать инструкции вызова в нескольких строках:

myobj.method1("hello").method2().method3("world").method4();

Это один объект возвращает сам себя для вызова следующего метода его же. Теперь ещё раз где шаблон проектирования, если выступает только один объект?

Спустя 1 минута, 44 секунды (4.09.2011 - 17:41) Guest написал(а):
Если автор сам не может разобраться в аспектах реализации (в чём я сомневаюсь и думаю что это всё таки переводчики), то Вы ведь должны руководствоваться своими рассуждениями smile.gif

Спустя 10 минут, 10 секунд (4.09.2011 - 17:52) Guest написал(а):
Вызова своих же методов в цепь это не есть шаблон проектирования тем более Цепочка обязанностей, это всего лишь способ реализации, да же не делегирования другому объекту, а самому себе что бы было более наглядно видна цепь операций. Если честно это даже не относится к объектному проектированию, так как не скрывает его деталей реализации.
В JS нет шаблонов их эмулируют вручную. То что приводит автор это способ реализации вызовов "методов" объектов, но ни как не есть шаблон, потому что, ещё раз, если бы это был шаблон он бы имел определённый спектр применения и контекстов, то есть (структурный, поведенческий или порождающий). А теперь примените пример к этим аспектам. Структурный - должен минимум содержать в себе каркас из нескольких объектов и связей между ними. Поведение - характеризуется динамическим изменением состояния и поведения объектов. Порождающий - и так ясно что он здесь порождает. ничего кроме возврата ссылки на себя самого. Если перевести на языки ООП, это this-> только внешний, и Вы хотите сказать что это шаблон? smile.gif

Спустя 10 минут, 36 секунд (4.09.2011 - 18:02) moskitos80 написал(а):
Цитата (Guest @ 4.09.2011 - 14:41)
Если автор сам не может разобраться в аспектах реализации (в чём я сомневаюсь и думаю что это всё таки переводчики), то Вы ведь должны руководствоваться своими рассуждениями  smile.gif

Да втом то и дело, что в Javascript я сам ещё новичёк - год где то... поэтому и сомневаюсь. Поэтому и вступил в дискуссию, надеясь что в ней всё таки родиться истина.

Спустя 31 минута, 18 секунд (4.09.2011 - 18:34) Guest написал(а):
Вот цепочка обязанностей, вот это шаблон цепочки обязанностей
Сравните его с примером автора.

function one(context)
{
var content;
if(context== 'base GUI')
{
// алгоритм обработки контекста номер 1 клика контрола
// Реакция этого обработчика срабатывает только тогда когда был клик на основной странице


return content;
}

var two = new two(context);
return two.content
}

function two(context)
{
this.content;
if(context== 'help')
{
// алгоритм обработки контекста номер 2 клика контрола
// Реакция этого обработчика срабатывает только тогда когда был клик на странице HELP

return this.content;
}
var three = new two(context);
return three.content
}

function three(context)
{
this.content;

// алгоритм обработки контекста номер 2 клика контрола
// Реакция этого обработчика срабатывает по дефолту

return this.content;
}

Спустя 1 минута, 13 секунд (4.09.2011 - 18:35) Guest написал(а):
Правда немного с реторнами в объектах перемудрил, не должно быть там

Спустя 4 минуты, 35 секунд (4.09.2011 - 18:39) Guest написал(а):
В ООП языках такой паттерн можно реализовать не делегированием как здесь, а наследованием.
Фактически цепочка используется в целях делегирования от объекта к объекту, что бы сформировать определённый алгоритм, но если он (объект) даёт просто возможность использовать свои методы способом цепи, это уже реализация но ни как не шаблон. smile.gif

Спустя 4 минуты, 49 секунд (4.09.2011 - 18:44) Guest написал(а):
ах, да как используется пример,

// Здесь можно использовать внутренний метод который бы возвращал контент 
// new one('HELP').content();

var content = new one('HELP').content;

Спустя 5 минут, 48 секунд (4.09.2011 - 18:50) moskitos80 написал(а):
Цитата (Guest @ 4.09.2011 - 15:34)
Вот цепочка обязанностей, вот это шаблон цепочки обязанностей
Сравните его с примером автора.

function one(context)
{ 
    var content;
    if(context== 'base GUI')
    {
        // алгоритм обработки контекста номер 1 клика контрола
        // Реакция этого обработчика срабатывает только тогда когда был клик на основной странице

       
        return content;
    }

    var two = new two(context);
    return two.content
}

function two(context)
{
    this.content;
    if(context== 'help')
    {
        // алгоритм обработки контекста номер 2 клика контрола
        // Реакция этого обработчика срабатывает только тогда когда был клик на странице HELP

        return this.content;
    }
    var three = new two(context);
    return three.content
}

function three(context)
{
    this.content;

    // алгоритм обработки контекста номер 2 клика контрола
    // Реакция этого обработчика срабатывает по дефолту

    return this.content;
}

Да вот это поведение:

пришёл объект - посмотрели: не наш, - передали другому. Другой посмотрел: не мой, - передал третьему. Третий посмотрел: мой! Что то сделал...

Что огорчает: английское название книги Стефанова: "javascript patterns" но скажите что же тогда описывает автор в этой книге?

Спустя 10 минут, 59 секунд (4.09.2011 - 19:01) Guest написал(а):
Может всё таки он приводит примитивную цепочку как пример но не паттерна, а синтаксиса или семантики, более понятной на минимальном уровне? Хотя вроде даже таким образом легче объяснить. Всё таки легче сначала изучить их (паттерны) в ООП языках а потом перевести их в объектные языки. Всё таки мне кажется автор хотел ввести в понимание через синтаксис smile.gif , тем самым уже запутав читателя. Об этом пишет Макконнелл, про не правильно подобранные аллегории. smile.gif

Спустя 5 минут, 30 секунд (4.09.2011 - 19:06) moskitos80 написал(а):
Цитата (Guest @ 4.09.2011 - 16:01)
Может всё таки он приводит примитивную цепочку как пример но не паттерна, а синтаксиса или семантики, более понятной на минимальном уровне? Хотя вроде даже таким образом легче объяснить. Всё таки легче сначала изучить их (паттерны) в ООП языках а потом перевести их в объектные языки. Всё таки мне кажется автор хотел ввести в понимание через синтаксис smile.gif , тем самым уже запутав читателя. Об этом пишет Макконнелл, про не правильно подобранные аллегории. smile.gif

Спасибо. Я конечно продолжу её чтение, но теперь уже буду знать, про что читаю. biggrin.gif

Спустя 2 минуты, 56 секунд (4.09.2011 - 19:09) Guest написал(а):
Да, я только что посмотрел smile.gif
Это перевод по моему или всё таки не правильная аллегория
Вот взять даже это
"Шаблоны повторного использования программного кода "
Всё таки больше похоже методы и способы использования повторного программного кода, но шаблон это что более абстрактное и не привязано к контексту языка программирования.

Спустя 6 минут, 32 секунды (4.09.2011 - 19:16) Guest написал(а):
Шаблон - это, мне кажется, всё таки не формальный стандарт использования чего то ...
Если в данном случае стандарт повторного использования программного кода, уже звучит не много парадоксально smile.gif


_____________
Дорогу осилит идущий...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.