2012-02-09 18 views
6

a = {} boş nesnesine sahibim. Ben console.log(a), console.dir(a), hattaNesnenin tüm gizli özelliklerini yazdırma

for(b in a) { 
    console.log(b); 
} 

yaptığınızda ben gibi __defineGetter__, hasOwnProperty, "gizli özellikleri" görmek alamadım vb

Ben bir nesnenin tüm özelliklerini yazdır nasıl ?

+0

Hangi tarayıcıyı kullandı Yani onları alabilir? Google Chrome'da, Google Chrome'u kullandığım – antyrat

+0

@antyrat'ın tüm özelliklerini görüyorum 17 ve 'console.log'unu kullandığım tek özellik' __proto__'. – Randomblue

+0

Bu özelliği açabilir ve içerde tüm sayısız özelliği göreceksiniz – antyrat

cevap

12

Kullandığınız, bir nesnenin non-enumerable özelliklerinin (ve muhtemelen prototipinden miras aldığı) özellikleridir. Onları JavaScript ile elde etmenin standart bir yolu olduğuna inanmıyorum.

Bir hata ayıklayıcısını kullanır ve bir nesneyi incelerseniz, genellikle bir nesnenin tüm özellikleri gösterilir (yalnızca numaralandırılmamış olanlar). Tüm ana tarayıcılarda şu anda yerleşik hata ayıklayıcılar var: Chrome'un Dev Araçları (Ctrl + ÜstKrkt + I); IE8 ve üstü "F12 Geliştirici Araçları" var; IE7 ve daha eski sürümler, VS.Net'in ücretsiz sürümü ile hata ayıklanabilir; Firefox'un son sürümlerinde yerleşik araçlar bulunur; eski sürümler için Firebug eklentisini alabilirsiniz; Opera'da Dragonfly var.

Güncelleme: söylediğin soru üzerine yorumlarında: Google Chrome'u 17 ve ben console.log kullanarak bkz tek özelliği kullanıyorum

__proto__ olduğunu.

Sağ. {}'un hiçbir özelliği yoktur, sadece bir prototiptir. __proto__'un solundaki küçük oku tıklarsanız, size __proto__'un özelliklerini gösterecektir. hasOwnProperty, toString, vb., Tüm özellikleri {} prototipinden alır (Object.prototype), nesnenin kendisinin özelliklerini değil.

JavaScript, bir nesnenin prototip ile desteklendiği anlamına gelen prototipal devralmayı kullanmaktadır. Nesnenin sahip olmadığı bir özellik değerini almaya çalışırsanız, JavaScript motoru, prototipin bu özelliğe sahip olup olmadığını görmek için nesnenin prototipine bakar; eğer öyleyse, bu değer kullanılır. Eğer prototip mevcut değilse, motor prototipinin prototipine bakar; ve böylece hiyerarşinin köküne ulaşana kadar. Bu nedenle, sahip oldukları kendi özelliklerine sahip nesneler hakkında bilgi alırsınız.

İşte yapıcı işlevi var:

İşte bir örnek. Nesne oluşturmak için new Foo kullanırsak, JavaScript motorunun atayacağı prototip üzerinde bir özellik koyarız. Henüz

var f = new Foo(); 

f hiç özelliklere sahiptir ve:

function Foo() { 
} 
Foo.prototype.bar = 42; 

en o yapıcısını kullanarak bir nesne oluşturmak Let

console.log(f.bar); // 42 

...Çünkü f "bar" adlı bir özelliğe sahip olmadığından,modelinin prototipi olan Foo.prototype nesnesine benziyor. Şimdi f 'ın "çubuk" özelliğini kaldırmak izin

f.bar = 67; 
console.log(f.bar); // 67 

: Şimdi

en f vermek kendi "bar" özelliği let

delete f.bar; 
erişmeyiz denerseniz ne olacak

f.bar şimdi? Eğer 42 dersem

console.log(f.bar); 

, üst işaretleri olsun. f'un artık "bar" adı verilen bir özelliği olmadığından, prototipten almaya geri dönüyoruz. ECMAScript'e 3. baskısında

Foo.prototype.bar = 96; 
console.log(f.bar); // 96 

(çoğu tarayıcı 3rd edition çizgisinde bir şey uygulamak), bir prototip atamak için tek yol: Bu ilişki o kadar, canlı olduğunu

Not Bir nesne, yukarıdaki gibi bir yapıcı işlevinin prototype özelliğiyle yapılır. 5th Edition ile, daha doğrudan bir yolu eklendi: Object.create, sen doğrudan bir prototip nesne geçirebilirsiniz:

var proto = {bar: 42}; 
var obj = Object.create(proto); 
console.log(obj.bar); // 42 
proto.bar = 67; 
console.log(obj.bar); // 67 
+0

Çok iyi yazılmış (+1), teşekkürler :) – nkm

3

Object.getOwnPropertyNames (obj) da olmayan her enumerable özelliğini gösterecektir, bunun her ne kadar .'un yaptığı gibi prototype chain aramayı izlemez.

Her ikisi de prototip zincirine kadar gider ve numaralandırılmamış olanları gösteren herhangi bir yöntem bilmiyorum.

Örnek:

  • Object.keys()

    zinciri gitmez ve
  • for in zincirinde yukarı gider ama görünmüyor olmayan, enumerable
  • göstermez:
    var o = Object.create({base:0}) 
    Object.defineProperty(o, 'yes', {enumerable: true}) 
    Object.defineProperty(o, 'not', {enumerable: false}) 
    
    console.log(Object.getOwnPropertyNames(o)) 
    // [ 'yes', 'not' ] 
    
    console.log(Object.keys(o)) 
    // [ 'not' ] 
    
    for (var x in o) 
        console.log(x) 
    // yes, base 
    

    yüzden sonuçlandırmak olmayan numaralar

Tabii ki prototip zincirine manuel olarak tırmanın ve Object.getOwnPropertyNames kullanın. Object, __defineGetter__ ve hasOwnProperty durumu için

Object.prototype özellikleri prototip zinciri araması üzerinden new Object nesneler bulunur.

console.log(Object.getOwnPropertyNames(Object.prototype)) 

Çıktı:

[ 'constructor', 
    'toString', 
    'toLocaleString', 
    'valueOf', 
    'hasOwnProperty', 
    'isPrototypeOf', 
    'propertyIsEnumerable', 
    '__defineGetter__', 
    '__lookupGetter__', 
    '__defineSetter__', 
    '__lookupSetter__' ] 
İlgili konular