hasOwnPropertyを直接呼ばない
とあるモジュールのソースコードを読んでいたら、以下のissueへのリンクがコメントとして書いてあった。
https://github.com/nodejs/node-v0.x-archive/issues/1707
hasOwnPropertyを直接呼ぶのでなく、Object.prototype経由で呼んだ方がよいとのこと。これ、parseIntとかグローバル直下の関数全般に言えるよな……
seen from Russia

seen from Singapore
seen from United States
seen from Singapore

seen from Thailand
seen from United States
seen from Singapore
seen from Russia

seen from Malaysia
seen from China

seen from France
seen from United States

seen from United States

seen from United States
seen from Brazil
seen from United States
seen from China
seen from Austria

seen from Argentina
seen from United States
hasOwnPropertyを直接呼ばない
とあるモジュールのソースコードを読んでいたら、以下のissueへのリンクがコメントとして書いてあった。
https://github.com/nodejs/node-v0.x-archive/issues/1707
hasOwnPropertyを直接呼ぶのでなく、Object.prototype経由で呼んだ方がよいとのこと。これ、parseIntとかグローバル直下の関数全般に言えるよな……
Objektumok-tulajdonságok elérése és a for … in JavaScript-ben
Objeltumok használata
A JavaScriptben minden objektum, a függvény, a tömbök, a változók, stb… Az objektumot kapcsos zárójelek határolják. JavaScript-ben nem létezik asszociatív tömb, csak indexei lehetnek, viszont objektumokkal kiválthatjuk őket, ugyanis egy objektum tulajdonság-érték párokból áll. Minden tulajdonság után kettőspont, az értékek után pedig vessző áll, ami alól csak az utolsó tulajdonság értéke a kivétel, ahonnan viszont el kell hagynunk a vesszőt. Ha véletlenül benne felejtjük, akkor az IE7 nagy valószínűséggel ki fogja akasztani a weboldalt. Nézzünk is rögtön egy példát, amiben létrehozunk egyet.
var obj = { name: 'Sam', age: 28, sex: 'male' };
Egy objektum tulajdonságának elérése, értékének kikérése az alábbi módokon történhet:
var obj = { name: 'Sam', age: 28, sex: 'male' }; // 1. console.log(obj.name); // 2. console.log(obj[name]); // 3. console.log(obj[0]); // 4. console.log(obj['name']);
Az első verzió egyszerű és rövid. Számomra ez az objektum-tulajdonság elérési mód a legszimpatikusabb.
A második verzióra olyankor lehet szükség, hogyha változóból akarjuk kinyerni egy tulajdonság – másnéven property – nevét. Ilyen eset lehet például, hogyha for…in-nel körbemegyünk egy objektumon.
A harmadik esetben a tuladonság neve olyan mint a tömbben egy index, tehát egy szám. Ezt nem szokás használni objektumoknál, (tömböknél így működik) de ettől függetlenül lehetséges.
A negyedik esetben sztringként adjuk meg a tulajdonság nevét. Ha nem így tennénk, akkor 2. verzióban említett módon egy változót keresne a program, ami csak akkor szerencsés, ha éppen ez a célunk.
Objektum-tulajdonság meglétének vizsgálata
Az alábbi kódban azt vizsgáljuk, hogy egy objektumban az adott tulajdonság létezik-e. A az objektum-tulajdonságnak sztringnek kell lennie a feltételben:
var obj = { name: 'Sam', age: 28, sex: 'male' }; if ('name' in obj) { console.log('A name tulajdonság létezik.'); }
Objektum egyik tulajdonságából a másik tulajdonságának elérése
A this JavaScript kulcsszó egy objektumra mutat, kérdés csak az, hogy melyikre…
var obj = { a: 10, b: function () { console.log(this, this.a + 1); return (this.a + 1); // 10 + 1 }, c: { a: 20, b: function () { console.log(this, this.a + 1); return (this.a + 1); // 20 + 1 } } }; // 1. obj.b(); // 2. obj.c.b();
A fenti példában látható, hogy lérehozunk egy függvényt és azon belül arra használjuk a this kulcsszót, hogy az objektum egy másik tulajdonságát használatba vegyük. A this kulcsszó értéke arra az objektumra mutat, melynek tulajdonságaként a függvény hívása megtörténik. Példával szemléltetve az első esetben az alapobjektum egy tulajdonságából érünk el this-szel egy máik tulajdonságot. A második esetben annyi változik, hogy az alapobjektum egy tulajdonságának újra egy objektumot adunk értékül, amin belül az egyik tulajdonságnak szintén van egy függvénye, ami a this kulcsszóval éri el az aktuális objektumnak megfelelő tulajdonságot, ami itt már az alapobjektum "c" tulajdonsága lesz.
Ha egy függvényt nem konstruktorként használunk, a this akkoris egy objektumra fog mutatni, méghozzá az ősobjektumra, a window-ra.
Ha azonban egy függvényt konstruktorként használjuk, a this az "osztály példányára" fog mutatni. Amikor a konstruktor egy publikus függvényébe egy privát láthatóságú függvényt helyezünk és innen próbáljuk elérni az objektumot a this-szel, nem sikerül, mert az a window-ra mutat.
var classFoo = function () { this.num = 10; this.init = function () { console.log(String(this), this.num); // [object Object] 10 (function () { console.log(String(this), this.num); // [object Window] undefined }()); }; }; var oFoo = new classFoo(); oFoo.init();
Annak kiküszöbölésére, hogy a this-t elérjük a privát függvényen belül is, be tudunk vezetni egy segédváltozót mindjárt a konstruktor függvény elején, ami eltárolja a this értékét (jelen esetben: that), így azzal hivatkozhatunk a privát a "példányváltozóra".
var classFoo = function () { var that = this; // eltároljuk a this kulcsszó értékét this.num = 10; this.init = function () { console.log(String(this), this.num); // [object Object] 10 (function () { // this kulcsszóval a változó továbbra sem elérhető console.log(String(this), this.num); // [object Window] undefined // felhasználjuk a this kulcsszó értékét; így már elérhető a "példányváltozó" console.log(String(that), that.num); // [object Object] 10 }()); }; }; var oFoo = new classFoo(); oFoo.init();
Menjünk körbe egy objektumon
Tömbök bejárására ne használjuk a for … in szerkezetet!
Amikor for … in szerkezettel végimegyünk egy objektumon, az örökölni fogja az ős, azaz az Object prototype-ját, ezért azok is elérhetők lesznek az objektumban. Ezekre a tulajdonságra legtöbb esetben nincs szükség, ezért ennek kivédésére a hasOwnProperty tagfüggvényt használhatjuk, amely egy feltételben kiszűri, hogy csak az objektum saját tulajdonságaival dolgozzunk.
var obj = { name: 'Sam', age: 28, sex: 'male' }, prop; // a nem DOM objektumokhoz for (prop in obj) { // csak a saját objektum-tulajdonságokkal foglalkozunk if (obj.hasOwnProperty(prop)) { console.log(obj[prop]); } }
Az IE8 és korábbi verzióiban a DOM objektumok nem öröklik az ős prototípusát, ezért a feltétel mégegy taggal bővül, méghozzá azzal, hogy az objektumban van-e hasOwnProperty tulajdonság; a kódblokk csak akkor fut le, ha mindkét feltétel teljesül.
// a DOM objektumokhoz for (prop in obj) { // csak a saját objektum-tulajdonságokkal foglalkozunk if ('hasOwnProperty' in obj && obj.hasOwnProperty(prop)) { console.log(obj[prop]); } }
Forrás
JavaScript Metaprogramozás
JavaScript függvények
Nicholas C. Zakas – Maintainable Javascript
[javascript] what is hasOwnProperty()?
**What is it?** The javascript method `hasOwnProperty()` is a method that can be run on an object that simply returns true or false depending on whether it has the property it is being tested for. **Quick Example:** var myObject = { a: 'one', b: 'two', c: 'three' } alert( myObject.hasOwnProperty('a') );// will alert 'true' alert( myObject.hasOwnProperty('d') );// will alert 'false' **[Working Demo](http://jsfiddle.net/WilsonPage/XGwUt/2/)** _I'm sure you can find some cool uses for this :)_