Jump to content
php.lv forumi

OOP js


Lynx

Recommended Posts

Vēlējos noskaidrot cilvēku domas par objektu izmantošanu javascriptā.

Pamazām attīstot projektu ir sarakstītas kopā ļoti daudz funkcijas, un bieži daļa funkciju būtu klasificējamas kā atsevišķa vienība lapas funkcionalitātes nodrošināšanai, piemēram, dragošana vai tooltipi.

Bieži šīs te funkcijas ik pa laikam izmanto globālos mainīgos, lai padotu datus, piemēram, tā pati dragošana: var _dragElement; glabā pašreiz kustināmo objektu, lai piemēram,

function doDrag(e){
if (e == null) var e = window.event; 
_dragElement.style.left = (_offsetX + e.clientX - _startX) + 'px';
_dragElement.style.top = (_offsetY + e.clientY - _startY) + 'px';
 }

Nebūtu katreiz jameklē, kurš objekts tiek kustināts.

 

Un tātad jautājums: vai ir loģiski šīs funkcijas un globālos mainīgos sabāzt atsevišķās klasēs, piemēram: var Drag = { }, lai nepiesarņotu vidi ar globālajiem mainīgajiem un kā tas attieksies uz koda performance?(Ar FF3 gan izskatās, ka tā vairs nekur nebūs problēma, bet tāpat interesē :))

Link to comment
Share on other sites

Blah blah blah

 

JavaScript nav objektorientēta valoda. Tā ir prototip-orientēta.

Pamatus vari apgūt šeit : http://mckoss.com/jscript/object.htm

Bet es ieteiktu lasīt base2 vai mootools

 

Tad vēl ir šādas lekcijas:

http://video.yahoo.com/video/play?vid=111593

http://video.google.com/videoplay?docid=-474821803269194441

 

 

edit: speciāli priekš Delfins, vakara lasāmviela : http://dean.edwards.name/weblog/2007/03/rules/

Edited by mefisto
Link to comment
Share on other sites

Eh, mefisto, es nejautāju par pamatiem, bet vairāk par ideoloģiju aiz objekt orientēta js izmantošanas.

Jo lielākā daļa rakstu par šo tēmu paņem oop kā status quo. Un nekur neapspriež galvenos mīnusus vai arī kad tieši loģiski būtu viņu izmantot.

 

Situācija ir tāda, ka pašlaik mans kods darbojas precīzi kā vajag un pilda savu funkciju, bet es vienmēr meklēju veido kā to uzlabot(gan lai pašam ērtāk, gan ātrāk darbojas) un šis šķita nākamais loģiskais solis un tieši tāpēc vēlējos dzirdēt citu viedokli. Un daži to arī izteica, paldies.

Link to comment
Share on other sites

Satura topikā es savulaik ieliku dažus labus linkus uz lasāmo par JS "OOP-ismu":

http://www.cs.rit.edu/~atk/JavaScript/manuals/jsobj/

http://www.crockford.com/javascript/

http://www.jibbering.com/faq/faq_notes/closures.html

http://www.onlinetools.org/articles/unobtrusivejavascript/

 

Manas domas - neimspeisi ir laba lieta. Man personīgi paša kodu patīk organizēt neimspeisos, tādējādi ir lielāka kārtība nevis liels kišmiš ar funkcijām globālajā neimspeisā.

Link to comment
Share on other sites

Blā blā blā...

 

JavaScript nav prototiporientēta. Tā ir procedurāla.

 

Ahā! Tā nav procedurāla - tā ir funkcionāla programmēšanas valoda.

 

Bet var būt gan funkcionāla prototip-objekt-orientēa?

 

Blah blah blah

 

JavaScript nav objektorientēta valoda. Tā ir prototip-orientēta.

 

Nevajag tā muļķoties, ok?

Link to comment
Share on other sites

Vai ir svarīgi strīdēties par terminaloģiju ? :)

 

Domāju, ka vienīgais, ko autors grib, ir neimspeisot mainīgos. Un izmantojot, JSON objektu pierakstu veidu vai jebkuru citu objektu būvēšanas veidu (par tiem citiem gan neesmu parāk informēts, bet JSON aktīvi lietoju), to lieliski var panākt.

Link to comment
Share on other sites

lol, funkcionāla? Tu vispār zini, kas ir funkcionāla valoda, marrtins? JS ir patālu no funkcionālas valodas. Tajā var mēģināt programmēt funcionāli, taču tas ir liels čakars, jo tā sākotnēji tam nav bijusi paredzēta.

Scheme, ml, haskell - lūk tās ir funkcionālas valodas.

Kā jau tev saka - JS ir prototiporientēta, nevis OOP: http://en.wikipedia.org/wiki/Javascript#Prototype-based. Prototip-orientētā valodā nav atšķirības starp klasi un instanci. Jauni objekti tiek veidoti mainot esošu objektu prototipus ("klases"). Savā veidā, vienkāršoti sakot, jebkurā dinamiskā valodā, kurā klasei runtaimā var mainīt (pielikt/noņemt) nost metodes/atribūtus varētu saukt par prototip-orientētu. Piemēram, Python.

Link to comment
Share on other sites

Es ļoti labi zinu, kas ir funkcionāla. Tevis nosauktajiem priekšā liekam Lisp un tad pārējos.

 

JS ir patālu no funkcionālas valodas?

 

Protams, ka Javascript nav pure functional, tomēr ir vistuvāk no visām "populārajām" valodām. Liels čakars? Spilgts piemērs jQuery. Ļoti eleganti, nevis čakarīgi.

 

Piemērs funkcionālai pieejai JavaScriptā.

function f(param)
{
return function (param2){
	return param * param2;
}
}
var a = f(2);
alert(a(3));

 

To pašu visnotaļ ērti var izdarīt Perl`ā, Ruby, Pitonā (jau čakarīgāk), taču pamēģini to, piemēram C vai Paskālā vai kādā citā zemāka līmeņa valodā - tad būs skaidrs, kas ir čakarīgi :)

 

Prototip-orientēts vai objekorientēts faktiski ir tikai implementācijas jautājums nevis fundamentālas atšķirības, ko ir vērts nodalīt.

 

Piemēram, Haskelī vai Erlangā arī var programmēt objektorientēti, tāpēc mēs tās valodas nesaucam objekt-orientētas.

Link to comment
Share on other sites

Ar vārdu čakarīgi es domāju lieko sintaksi, kas tur dafiga jāraksta, lai panāktu kautko tik vienkāršu kā, piemēram, funkciju, kas atgriež citu funkciju. Pat pitonā to var pierakstīt daudz vienkāršāk: f = lambda x: lambda y: x*y.

 

JS ir tikai funkcionālas valodas iespējas, nevis tā IR funkc. valoda. Tikpat labi, es varu teikt, ka arī C++ ir funkcionāla valoda:

 

#include <boost/function.hpp>
#include <boost/bind.hpp>

template <class T>
T Mul(T param, T param2)
{
return param * param2;
}

template <class T>
boost::function<T (T)> f(T param)
{
return boost::bind(Mul<T>, _1, param);
}

boost::function<int (int)> a = f(2);
std::cout << a(3);

 

Bet es ļoti šaubos vai tu atradīsi kādu, kurš tev piekritīs par to, ka C++ ir funkcionāla valoda.

Link to comment
Share on other sites

Šajā gadījumā JS lieki ir tikai statementi (return {} par iekavām var padiskutēt), bet C++ variants tiktiešām IR --pī-- :) Šajā sakarā man patīk http://en.wikipedia.org/wiki/Greenspun's_Tenth_Rule

 

Šāds piton pieraksta variants kurā versijā parādījās?

 

Bet es ļoti šaubos vai tu atradīsi kādu, kurš tev piekritīs par to, ka C++ ir funkcionāla valoda.

Taču atrodas kāds, kas apgalvo, ka JS valoda *NAV* objektorientēta ;)

Link to comment
Share on other sites

Tev kaut kā nešķiet, ka tieši vairums apgalvo, ka JS NAV OOP un tikai mazākums (vai mazāk zinošie) apgalvo, ka JS ir OOP?

Stulbs salīdzinājums (bet tomēr): "JavaScript prototype oriented" vs "JavaScript OOP" gūglē atgriež 499000 vs 276000 ierakstus.

Es nenoliedzu, ka JS'ā var programmēt OOP'iski (izmantojot OOP ideoloģiju). Bet veids, kā tu implementēsi tos objektus, tas nebūs OOP veidā/sintaksē - tev nāksies izmantot prototype-oriented programmēšanu. Tieši tas pats kautvai ar to Pitonu - var mēģināt "funkcionāli programmēt", bet Pitons NAV funkcionāla programmēšanas valoda. Arī C valodā var OOP'iski programmēt, bet nu... neviens tak nesauks C par objektorientētu valodu.

 

Šāds piton pieraksta variants kurā versijā parādījās?

Hvz, bet 2.3 versijā toč ir.

Link to comment
Share on other sites

To, ka JS ir funkcionāla es liku pretī apgalvojumam, JS *NAV* objektorienēta.

 

Ja valodā X vienlaicīgi (un bez *hackiem*, skat vēlreiz Greenspun's Rule) var programmēt objektorientēti un/vai funkcionāli un/vai procedurāli un/vai ...., tad to mierīgi var pieskaitīt vienai, otrai vai trešai (vai jebkādā kombinācijā) valodu klasei un abgalvot, ka tā NAV ir parasta kašķēšanās.

 

Ja Tev patīk google, tad

`JavaScript prototype oriented`187,000

`JavaScript object oriented` 473,000

bet šajā gadījumā tas nav būtiskākais, jo kašķēšanās, kurai valodu klasei pieskaitīt konkrētu valodu, notiek arī daudz vairāk pieredzējušu programmētāju starpā. Būtiski ir tas, ka programmēt, piemēram, objektorientēti C nav tik eleganti (skat savu iepr pdf), kā programmēt funkcionāli JavaScript (skat jQuery). Un ja nav eleganti, tad rodas "liekvārdība" un pie noteiktu rindiņu/moduļu/simbolu skaita, kods vairs nebūs lasāms/uzturams. Jo objektorientēts C nezamazinās koda daudzumu (nepalielinās abstrakcijas līmeni), turpretī funkcionāla pieeja JS - samazina koda apjomu (palielina abstrakcijas līmeni), tātad to brīvi var pieskaitīt funkcionālo valodu klasei.

 

Bet veids, kā tu implementēsi tos objektus, tas nebūs OOP veidā/sintaksē - tev nāksies izmantot prototype-oriented programmēšanu.objektorientētu valodu.

Protams - to jau es arī teicu - atsķiras tikai objektorientētās pieejas implementācija. Sintakse nav ierastā Java/C++, bet ir cita - taču pamatideja paliek - veidot leilāku abstrakciju par, piemēram to pašu C. Plus vēl fīčas, ko dod prototype konstrukcija kā tāda.

Link to comment
Share on other sites

×
×
  • Create New...