Firefox core javascript bug: instanceof,isPrototypeOf
van az alábbi kód, ami igazából bmilyen faszerkezetre modelt illeszt. szal DOM,FileSystem stb szépen kirajzoltatható vele, de csak IE alatt, firefox szórja rá a szebbnél szebb bugokat, ott kezdődik, hogy instanceof nem működik rendesen(azt alerteztem ki), false értéket ad vissza ott, ahol truet kéne, ha átugroljuk azt a részt, akkor meg ezer másik hibát ad ki.
próbáltam prototypeokkal trükközni az egyes elemtípusoknál, és jól be is szoptam, mert gyanús, hogy core javascript bug van a firefoxban.
jah a kérdés :D meg tudja ezt nekem valaki olyanra csinálni, hogy ne legyen bugos? :D mert én már feladtam, írtam jelentést a bugról, azt jegeltem a projectet
■ próbáltam prototypeokkal trükközni az egyes elemtípusoknál, és jól be is szoptam, mert gyanús, hogy core javascript bug van a firefoxban.
jah a kérdés :D meg tudja ezt nekem valaki olyanra csinálni, hogy ne legyen bugos? :D mert én már feladtam, írtam jelentést a bugról, azt jegeltem a projectet
Object.extend=function (o,e){if (o instanceof Object && e instanceof Object) for (var i in e) o[i]=e[i]; return o}
Function.prototype.parameters=function (){for (var i=0,a=[]; i<this.arguments.length; i++) a[i]=this.arguments[i];return a;}
Object.toString=function (o){var s=[];for (var i in o) s.push(i+" => "+o[i]);return s.join(", ");}
String.construct=function (times,iterator){var s="";for (i=0; i<times; i++) s+=iterator;return s}
Function.prototype.write=function (o){this.prototype=o; return this}
Function.prototype.extend=function (e){Object.extend(this.prototype,e); return this}
Object.merge=function (o,e){if (typeof o=="object" && typeof e=="object") for (var i in e) if (!(i in o)) o[i]=e[i]; return o}
function Model()
{
var nodeTypes={};
var prototype=
{
model: this,
addChild: function ()
{
if (!this.hasChildren) return false;
var parameters=arguments.callee.parameters(),type=parameters.shift();
type=type instanceof Type?type:nodeTypes[type];
if (!(type instanceof Type)) return false;
this.childNodes.push(new type.setup(type,parameters,this));
return this.childNodes[this.childNodes.length-1];
},
removeChild: function ()
{
}
}
function Type(key,addon,initialize)
{
this.key=key;
this.prototype=Object.merge(addon,prototype);
this.initialize=initialize;
this.setup=function (type,parameters,parent)
{
this.nodeType=type;
this.parentNode=parent;
this.level=this.parentNode.level+1;
if (this.hasChildren) this.childNodes=[];
if (typeof initialize=="function") initialize.apply(this,parameters);
return this
}
this.setup.prototype=addon;
}
var setup=function()
{
var parameters=arguments.callee.parameters();
if (this.hasChildren) this.childNodes=[];
this.level=1;
alert(Object.toString(this.constructor.prototype))
if (typeof this.nodeType.initialize=="function") this.nodeType.initialize.apply(this,parameters);
return this;
}
Object.extend(setup,
{
addType: function (key,addon,initialize){nodeTypes[key]=new Type(key,addon,initialize)},
removeType: function (key){delete nodeTypes[key]},
rootType: function (key){key=key instanceof Type?key:nodeTypes[key]; if (!(key instanceof Type)) return false;this.prototype=key.prototype;this.prototype.nodeType=key;}
});
return setup;
}
var FileSystemObject=new Model()
with (FileSystemObject)
{
addType("root",{hasChildren: true,print: function (){var s="OBJECT TREE<br \/>"+this.name+"<br \/>";for (var i=0; i<this.childNodes.length; i++)s+=" "+this.childNodes[i].print();return s}},function (name){this.name=name});
rootType("root");
addType("folder",{hasChildren: true,print: function (){var s=this.name+"<br \/>";for (var i=0; i<this.childNodes.length; i++)s+=String.construct(this.level," ")+this.childNodes[i].print();return s}},function (name){this.name=name});
addType("file",{hasChildren: false,print: function (){return this.name+"<br \/>"}},function (name){this.name=name});
}
var FSO=new FileSystemObject("root");
var alap=FSO.addChild("folder","alap");
var mely=alap.addChild("folder","mély");
mely.addChild("file","mély gyerek");
mely.addChild("file","mély lány");
var deep=alap.addChild("folder","deep");
deep.addChild("file","deep girl");
var ground=FSO.addChild("folder","ground");
ground.addChild("file","ground girl");
FSO.addChild("file","settings");
document.write(FSO.print())
var FSO2=new FileSystemObject("root2");
document.write(FSO2.print())
téma
viszont az instanceoffal elég komoly bug van ffben. ha megnézem az object konstruktorát, akkor jót ad, de ha instanceoffal kérdezek rá, vagy prototypeoffal, akkor viszont nem. szóval nem értem mi baja, kitöröltem azt a részletet, meg jelentettem a firefoxnál a hibát
érdekel
Engem iszonyatosan érdekel ez a dolog, és konyítanék is némileg a js-hez, de amit írsz, abból sajnos nem sokat értek. (Ha a hibajelentésed is így néz ki, kétlem, hogy bárki rá fog nézni.)
Nem tudnál - lehetőleg max 10 soros - mindtakódot mutatni, ami másképp viselkedik ff-ben, mint ie-ben és operában?
Megköszönném,
fraki
Tessék
fontos, hogy prototypenak kell elnevezni a változót, és hogy a builder átvegyen a BUGtól paramétert (azt ne kérdezd, hogy miért)
reserved keyword?
Végülis miben akadályoz az, ha nem használhatod a "prototype" elnevezést egy változóra?
A bugriportra nem az lesz a válasz, hogy a "prototype" reserved keyword?
Nem
és ha mégis úgy veszed, mintha foglalt szó lenne?
Jól látom, hogy ha máshogy nevezed el, minden rendben van? Ez nem arra utal, hogy a "prototype" szó használata nem szerencsés így vagy úgy?
(láttam ezt a "data" dolgot és írtam rá tippet is, hogy mi lehet) Előfordult már velem máskor, hogy egy reserved szót használtam, és tök odanemillő hibát generált. Ebben az esetben is a "prototype" foglalt név használata egy másik esemény együttálásakor generál hibát, ebben számomra nincs meglepő.
Khmm
Új link
OK
Remek, így tovább :)
Reméljük
törekedj a lényegre
Egyrészről nem értem, hogy miért kell 5 oldalnyi kódot beilleszteni, ahelyett, hogy csak a problémára összpontosítanál pár sorban??? Én (és még sztem sokan mások is) az ilyen témákat kapásból átugrom, mert mire kibogarásznám a kódot, lemegy a nap - megjegyzem reggel 04:18-kor nem is meglepő, hogyha senki nem jön rá a megoldásra. Másrészről ez nem az első ilyen témád... A múltkori is (Firefox removeChild bug) pont ilyen volt, kilóméteres kód, majd 5 perc múlva egy "ja, megoldottam" komment - persze a megoldást már nem írtad oda, csak miután megkértek. Nem értem a logikád, meg hogy ezeknek mi értelme van...
Hogy konstruktív is legyek, talán tényleg foglalt a prototype kulcsszó: http://www.quackit.com/javascript/javascript_reserved_words.cfm
xxx
Csak hogy konstruktív legyek érdekes módon az ezzel foglalkozó szakemberek komolyan veszik a kérdésem, oda is leírtam az új kódot, amit ide, és nem volt ilyen felvetésük, hogy a prototype foglalt, vagy semmi hasonló.
Idővel majd csak rájössz, hogy érdemes okosan kérdezni.
Egyszer majd csak, de hogy nem most, és nem miattad :D
Igazából mondjuk az alap, ami átvillan az ember agyán, ha hosszú kódot lát, az az, hogy honnan másolta a kérdező. Nah most ha így állsz ahhoz amit írok, akkor a kérdéseim nem hozzád szólnak, így nem tartok igényt a válaszaidra. (Persze tudom, hogy erről szó sem volt, csak próbálom elképzelni, hogy kb mit gondolhatsz, mert én is írok megoldásokat prog.hu-ra, és van valamennyi tapasztalatom ezzel kapcsolatban.)
ezt a vonalat nem kéne erőltetni
OK
Nem figyeltél
Prototypeja egyébként meg csak függvénynek lehet, szóval objectben, változóban nem értem miért ne lehetne ez a név.
ajjaj
Nem véletlenül szintaktikai kulcsszó a mozillás specifikációban, mivel a prototype chain elég core JS fícsör, következésképp objektummezőt ennek elnevezni elég nagy bornírtság.
Ez sem egészen pontos sztem :-)
Igen
ecma 262-ben nem lefoglalt szó
Pontosan
ECMAScript (3rd edition) specifikációban leírtaknak. Szerintem nem jogos arra hivatkozni, hogy az már egy több, mint 7 éves dokumentum, inkább vegyük alapul a JS 2.0 wiki oldalát (ECMAScript v4)... Az is bug lenne, ha a böngésző hibásan kezelne egy a html 4.01-ben specifikált (az a speci is szinte pontosan egyidős az előbbivel) tag-et, akkor is, ha az esetleg a html 5 piszkozatában már nem létezik (de még akkor sem, ha az nem piszkozat). Ha a doctype 4.01-et jelöl, akkor úgy kell feldolgozni. Nem véletlen, hogy már a JS 1.7 használatát is külön jelölni kell a böngésző(k)ben: ott mások a kulcsszavak, mint 1.6-ban. Így egy 1.6-ben működő kód esetleg kiakad JS 1.6-al értelmezve, mert egy ilyen kulcsszót használ azonosítóként. (lást bővebben)
A témakezdéssel viszont én sem értek egyet. Egy bug report-nak az a lényege, hogy leírd azt a minimális kódot, amiben máshogy viselkedik, mint ahogy kéne. Tény, hogy a weblabor fóruma nem egy bugtracker, de ha már azt a tényt állítod, hogy bug, akkor mutass egy könnyen érthető kódot hozzá. Ha valaki le akarná ellenőrizni, hogy itt tényleg bug-ról van szó, akkor először meg kéne értenie a programod működését, realizálni, hogy nem valami tervezési hiba vagy ilyesmi a probléma. Szerintem az égvilágon senki sem kötött volna bele, hogyha éjjel 4 óra helyett 9 órakor nyitod a témát, és már csak a TEST osztályos kódodat mutatod. (Amúgy ott sem teljesen értem, hogy minek kell a TEST osztály ehhez, de ez még elnézhető.) A lényeg ennyi:
Fene tudja, ez már lehet, hogy személyeskedés (akkor bocsi), de azért én mégis úgy gondolom, hogy nem ez a helyes út. Mégpedig pont a hibakeresés szempontjából (akár a környezet hibája, akár a Tiéd). De szíved joga, ha Neked így gyorsabb, kényelmesebb a fejlesztés, akkor nem szólok bele. De az biztos, hogy bugot nem ilyen terjedelmű kóddal kell jelenteni, mert esetleg nem fognak komolyan venni.
Üdv.
foglalt szagú
Neked mindegy :)
Amúgy JS 2.0-ban sem igazi foglalt név, csak "syntactic keyword". Azaz van olyan szintaktikai környezet, amikor különleges jelentéssel bír: mégpedig egy class definicó belsejében a var illetve function előtt. Jelenleg is sok forgalomban lévő javascript kód (prototypejs, yahoo ui, jquery, base2, ...) használja a get, type, xml, namespace neveket, amik ugyanúgy syntactic keyword-ök 2.0-ban.
off
Hmmm valahogy nem örülök neki, hogy 2.0-ban lesznek class definiciók. Nekem nagyon szimpatikus (volt) a jelenlegi JS objektum modellje.
(Mellesleg a YUI stb helyében sem használnám ezeket a neveket -- bár ők talán elég nagyok ahhoz, hogy nyomást gyakoroljanak a szabványra és miattuk biztosan nem fogják az FF fejlesztők egyszer véletlenül pl. az XML nevet -kis vagy nagy betűvel?- foglaltá tenni valamelyik verzióban :-)
:-)
A témakezdés tényleg nem volt a legjobb :-) majd legközelebb kicsit jobban átgondolom.
Az meg, hogy hogyan dolgozom magánügy, de ha már ennyire érdekel, akkor azért debuggolok a végén, mert ritkán szoktam hibát találni, és így csomó felesleges próbálgatástól kímélem meg magam, és mondjuk ekkora méretű kódot csak ilyen extrém esetben nehéz debuggolni, amikor a hiba oka ismeretlen, legtöbb esetben nem szokott gondot okozni a dolog.
Ha nincs ellenvetésed a kódodat hozzáírom a bugreporthoz, kösz.
(csak halkan jegyzem meg, hogy az eredeti kódnak igazából csak a bugreport a haszna, mert ugyanazt a melót, amit csinál xml+xsl lazán elvégzi - gondolom sokkal rövidebb idő alatt. szóval csak tényleg nagyon speciális esetekben tudom hasznát venni, a dolognak - vagy akkor sem :D persze erre csak ma jöttem rá, miután jobban beleástam magam az xslbe, és rájöttem, hogy kb ugyanazt akarom megvalósítani javascriptben, mint ezek az emberkék az xml+xsl kombóval)
Megoldás