Autor Zpráva
_es
Profil
Existuje, aspoň pre nejaké prehliadače, možnosť dostať sa ku všetkým vlastnostiam objektu Math a podobných objektov, cez nejaký cyklus alebo nejaký zoznam?
Darker
Profil
Tím myslíš, že by ti prohlížeč vypsal, které vlastnosti podporuje?
_es
Profil
Darker:
Myslím tým to, že v cykle for..in ani v cykle for each...in (JavaScript 1.6) sa tie vlastnosti neobjavia.
Či neexistuje, aspoň pre niektoré prehliadača nejaká finta, alebo rozšírenie javascriptu, ako by sa to dalo.
peta
Profil
http://www.w3schools.com/jsref/jsref_obj_math.asp
Take mi to nejde, vypada to na novinku. IE i FF stejne Je pravda, ze jsem to teda nikdy nepotreboval, ale. Zkousim jeste google, ale moc si od toho neslibuji.
t = '';
for (i in Math)
{
t+='\n'+i;
}
document.write(t)

A nic.
peta
Profil
Nic, i google zklamalo. Jen par zajimavosti.
alert(Math)
alert(Math.constructor)
http://javascript-reference.info/#object
Zkousel jsi to pres jquery? treba to ma vychytane.
_es
Profil
peta:
Take mi to nejde, vypada to na novinku.
Normálnym spôsobom to nejde vo všetkých prehliadačoch.
Zaujímalo ma, či existuje nejaký "nenormálny" spôsob, aspoň pre niektoré prehliadače.

Zkousel jsi to pres jquery?
Ako by tomu pomohla definícia jednej "všemocnej" funkcie?
Ktorá metóda toho objektu/funkcie by mohla byť k tomuto užitočná?
sysel
Profil
Mám obavu, že pokud objekt Math neobsahuje metodu, kterou lze prohlížet jeho vlastnosti, tak jsme nahraní. (Co by tak asi provedlo Math.toString() ;-) )
Chamurappi
Profil
Reaguji na sysla:
Co by tak asi provedlo Math.toString() ;-)
Teď vrátí "[object Math]", to asi není nijak překvapivé…


Reaguji na _es:
Zkoušel jsem si hrát s VBScriptem (v Exploreru totiž sdílí stejné proměnné jako JS), ale ten je na enumerace a OOP úplné nemehlo, takže tudy cesta nepovede. Ani žádná nová JS-udělátka v Mozille nepomáhají.
Zdá se, že to skutečně nijak nejde — a čím víc nad tím přemýšlím, tím víc mi to připadá jako chyba návrhu. Moudré hlavy řadu let přemýšlejí, jak zařídit, aby se uživatelsky definovaní členové objektu neobjevovali ve smyčce for..in a nad opačným zadáním zatím patrně nikdo neuvažoval. Asi chybí poptávka.

Kompletní nativní objektový model asi půjde vyčíst u Mozilly ze zdrojáků a u Exploreru z typové knihovny schované v resource-části souboru JScript.dll. (Nicméně rozumím, že tenhle postup nehledáš.)
_es
Profil
Chamurappi:
Zdá se, že to skutečně nijak nejde — a čím víc nad tím přemýšlím, tím víc mi to připadá jako chyba návrhu. Moudré hlavy řadu let přemýšlejí, jak zařídit, aby se uživatelsky definovaní členové objektu neobjevovali ve smyčce for..in a nad opačným zadáním zatím patrně nikdo neuvažoval. Asi chybí poptávka.

Napadlo ma to v súvislosti s nápadom, spraviť kalkulačku cez JavaScript.
Aby nebolo treba napríklad funkciu sínus zapisovať ako Math.sin(vstupná hodnota).
Dá sa to jednoducho cez príkaz with, no ten je zase nedoporučovaný pre jeho zlý vplyv na optimalizáciu skriptu.
Preto som chcel doplniť názvy tých funkcií/metód/vlastností do globálneho objektu, no asi sa k nim nedá dostať.
Pevný zoznam vlastností nie je vhodný pre doprednú kompatibilitu, ak by bol napríklad objekt Math nejako v budúcnosti doplnený.
_es
Profil
Chamurappi:
Zdá se, že to skutečně nijak nejde — a čím víc nad tím přemýšlím, tím víc mi to připadá jako chyba návrhu. Moudré hlavy řadu let přemýšlejí, jak zařídit, aby se uživatelsky definovaní členové objektu neobjevovali ve smyčce for..in a nad opačným zadáním zatím patrně nikdo neuvažoval.

Podľa najnovšej normy ECMA 262 to predsa len ide, no podporuje to, čo som skúšal, zatiaľ iba Google Chrome 5:
javascript:alert(Object.getOwnPropertyNames(Math))
_es
Profil
Metódu getOwnPropertyNames podporuje aj Firefox 4.0.
Witiko
Profil
_es:
Ano, ECMA5 je řešením, pokud jde člověku o blbnutí s konzolí. Na reálné nasazení té části specifikace, pro kterou není možné napsat ECMA3 kompatibilní fallback funkce, je ale obávám se ještě trochu brzo.

Chamurappi:
No, jak říká _es - ECMA5 specifikace umožňuje s abstraktností, modifikovatelností, smazatelností i enumerovatelností atributů objektů blbnout do aleluja. :-)
Witiko
Profil
Hrál jsem si s ECMA5 (a doimplementovával ECMA3-compilant fallback metody pro část novinek) a našel jsem zajímavý fenomén (bug?) Měl jsem za to, že for ... in cyklus prochází jen enumerovatelné atributy stejně jako z něj odvozené funkce ve specifikaci ECMA5, konkrétně:

Object.keys – vrací pole s názvy vlastností objektu předaného v parametru; vynechává přitom neenumerovatelné vlastnosti, které by vynechal příkaz for…in
Object.getOwnPro­pertyNames – vrací pole s názvy vlastností objektu předaného v parametru a to včetně těch, které by vynechal příkaz for…in (včetně neenumerovatelných)


Při implementaci Object.keys jsem však zjistil, že for ... in cyklus se chová zvláštně:

for(var i in window) {if(!window.propertyIsEnumerable(i)) console.log("Zkouška sirén!");}

Console.log na mě vyskočilo 499x. Zdá se, že cyklus prochází i neenumerovatelnými položkami. Zjišťování enumerovatelnosti nicméně není v moci ECMA 3 a stejně tak jsem měl za to, že for ... in cyklus má procházet pouze neenumerovatelnými položkami. Co to?
_es
Profil
Witiko:
Console.log na mě vyskočilo 499x.
V akom prehliadači?

Zdá se, že cyklus prochází i neenumerovatelnými položkami.
Ale ten cyklus môže prechádzať aj inými objektmi ako window a vtedy by sa podmienka mohla vyhodnotiť nesprávne.
Witiko
Profil
_es:
V akom prehliadači?
Chromium

Ale ten cyklus môže prechádzať aj inými objektmi
Konkrétně?
_es
Profil
Witiko:
Konkrétně?
Rôznymi prototypmi.
Witiko
Profil
_es:
for(var i in window) {
  if(window.hasOwnProperty(i) &&
    !window.propertyIsEnumerable(i))
    console.log("Zkouška sirén!");
}

Už ne 499 ale 386. Stejně ale žádná výraznější změna. Prošel jsem navrácené atributy, všechny jsou "own property", tzn. neobsažené v prototypu / statické a unikátní pro instanci. Přesto je 386 atributů označených jako neenumerovatelné.

Podotýkám, že
Object.keys(window);
žádné z těchto neenumerovatelných atributů nenavrací.

Object.keys(window).length === (function() {
  var number = 0;
  for(var i in window) {
    if(window.hasOwnProperty(i) &&
       window.propertyIsEnumerable(i))
      number++;
  }; return number;})();
ale
Object.keys(window).length !== (function() {
  var number = 0;
  for(var i in window) {
    if(window.hasOwnProperty(i))
      number++;
  }; return number;})();


Něco je zkaženého ve státě dánském...
_es
Profil
Witiko:
Možno bude problém v tom, že objekt window je voči iným objektom zvláštny tým, že sa naň prilepujú aj globálne premenné, Chrome podporuje tuším aj konštanty, atď. Možno pre niektoré metódy nie je každá „vlastnosť“ považovaná za vlastnosť. Nepodporuje Chrome aj cyklus for each...in?
Witiko
Profil
_es:
Nepodporuje. Každopádně takhle fallback pro ECMA5 metody nenapíšu, testování enumerovatelnosti není v ECMA3 možné, pokud se nelze spoléhat na to, jakým způsobem funguje for ... in loop. :-(
Witiko
Profil
Tak jsem o tom pohovořil na chatu Stack overflow a zdá se, že se jedná o bug specifický pro Chrome:
http://code.google.com/p/chromium/issues/detail?id=44262

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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