Autor Zpráva
Kcko
Profil
Ahoj, zajímalo by mně, zda-li jde nějak "vyexportovat" (obalit do něčeho nebo tak), vlastní JS objekt, abych se vyhnul kolizi např. s objektem nebo funkcí, která se v projektu jmenuje stejně?

calendar.js
   function Calendar(el)
    {
        
        this.el     = $(el);
        ...
 
        this.open = function() {
            ...
        };        
        this.close = function() {
          ...
        };
 
  
    }
Radek9
Profil
Kcko:
Trošku málo informací.
1) Předpokládám, že jde o webovou stránku, je to tak?
2) Používáš nějaký bundler? (Browserify, Webpack)
3) Používáš čistý JavaScript (alias ES5), nebo používáš i transpiler? (TypeScript, Babel)

Pokud se chceš vyhnout kolizím objektů v globálním prostoru, tak se v zásadě používají moduly. A to buď CommonJS moduly (standard z Node.js):

calendar.js
function calendar(el) {
  ...
}
module.exports = Calendar

index.js
const Whatever = require('./calendar')
const c = new Whatever()

Nebo standardní ES moduly:

calendar.js
function Calendar(el) {
  ...
}
export default Calendar

index.js
import Whatever from './calendar'
const c = new Whatever()

Pokud to potřebuješ použít v prohlížečí, budeš potřebovat bundler. Pokud chceš použít ES moduly, tak dost pravděpodobně budeš potřebovat i transpiler (ačkoli Webpack možná už umí bundlovat i ES moduly).
Kcko
Profil
Radek9:
Ahoj díky za reakci.

1) ano
2) ne
3) ano :-)

Četl jsem si cosi o exportu přes NODE a knihovnu require a přišlo mi to nějaké složité.
Ale je to defakto to co pišeš na konci svého příspěvku.

Časem se do toho ponořím (až bude více času a chuti) a detailněji to prozkoumám.
Takže to potřebuji přes něco prohnat. (Jsem z toho poslední dobou trošku znechucenej :-) ... všechno furt něčím buildit a kompilovat, slastně vzpomínám na doby, kdy jsem s webama začínal :-) ...)

To je v programování framework + miliony dependecies
kodování nejlépe preprocessor (SASS / LESS)
JS (viz tranpilery, bundlery)
taskmanagery (gulp / grunt ...)
Git + CI
.
.
.
.
.

=> web
Radek9
Profil
Kcko:
Na RequireJS jsem zapomněl. To se buildit nemusí. Ale pro definici každého souboru se používá tenhle zápis:
define(['./dependency1', './dependency2'], function (dep1, dep2) {
  return somethingToExport
})

A ne každá knihovna to podporuje.

Načtení hlavního modulu je pak popsáno tady: requirejs.org/docs/api.html#config
Kcko
Profil
Radek9:
Vím, používáme to nově na jednom projektu a občas to spíš přidělá práci než to ulehčí (některé jq pluginy nejsou napsané úplně optimálně a pak se to různě hádá nebo to prostě nefunguje).
Každopádně mi to zatím stačí, až nastane vhodná konstelace, tak se k tomu zase vrátím.
Keeehi
Profil
Tak pokud chceš něco odstínit a chceš si to udělat ručně a ne na to používat knihovny, tak by to přece mělo stačit zabalit do anonymní funkce.
var myCalendar = (function () {
    function Calendar(el)
    {   
        this.el     = $(el);
        ...
 
        this.open = function() {
            ...
        };        
        this.close = function() {
            ...
        };
    }
    
    return Calendar;
})();
Radek9
Profil
Keeehi:
Tím ale úplně neřešíš jádro problému, jen ho omezíš. Pořád máš v globálním prostoru myCalendar.
Kcko
Profil
Ano, protože nevíš, jestil tam někde není "myCalendar".
Navíc jsem to myslel tak, že budu mít soubor calendar.js který bez starostí nalinkuju do projektu a budu jej moci využívat bez možnosti konfliktu.
Keeehi
Profil
Radek9:
To bude tím, že jsem myslel že to je cíl, že ho chce jen přejmenovat. Pokud nemá být z globálního prostoru dostupný pak stačí jen
(function () {
    function Calendar(el)
    {   
        this.el     = $(el);
        ...
 
        this.open = function() {
            ...
        };        
        this.close = function() {
            ...
        };
    }
})();
Radek9
Profil
Keeehi:
Tady jde spíš o to přistupovat k exportům z knihoven/modulů nikoli skrze globální prostor (který je náchylný k přemazání kvůli kolizím jmen), ale skrze cestu k souborům, která bude vždy jedinečná. Pro se používají CommonJS nebo ES moduly.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0