2013-09-24 17 views
6

ich einige Code haben:Wie die Eigenschaften eines Prototyps des Objekts iterieren

var obj = function() { }; // functional object 
obj.foo = 'foo'; 
obj.prototype.bar = 'bar'; 

for (var prop in obj) { 
    console.log(prop); 
} 

Was mich überrascht, ist, dass alles, was protokolliert wird foo ist. Ich erwartete, dass die for-Schleife auch über die Eigenschaften des Prototyps obj iteriert (nämlich bar), weil ich nicht auf hasOwnProperty überprüft habe. Was fehlt mir hier? Und gibt es eine idiomatische Möglichkeit, alle Eigenschaften des Prototyps zu iterieren?

Ich habe dies in Chrome und IE10 getestet.

Vielen Dank im Voraus.

+1

Wenn Sie Eigenschaften an den Prototyp anhängen, werden die Eigenschaften für die Instanzen dieses Objekts und nicht für das Objekt selbst verfügbar. –

Antwort

6

Sie durchlaufen die Eigenschaften des Konstruktors, Sie müssen eine Instanz erstellen. Die Instanz ist das, was von dem prototype Eigenschaft erbt Konstruktor:

var Ctor = function() { }; // constructor function 
Ctor.prototype.bar = 'bar'; 
var obj = new Ctor(); // instantiation 

// adds own property to instance 
obj.foo = 'foo'; 

// logs foo and bar 
for (var prop in obj) { 
    console.log(prop); 
} 
+0

Aha! Vielen Dank. – gwg

0

Wenn Sie alle eine Vererbungshierarchie beibehalten werden sollen durch die Definition der Eigenschaften schon vor dem Objektinstanziierung, können Sie den unten Ansatz folgen können. Dieser Ansatz druckt die Prototyphierarchiekette.

Hinweis: Bei diesem Ansatz müssen Sie den Konstruktor zunächst nicht erstellen.

function myself() { 
    this.g = ""; 
    this.h = []; 
    this.i = {}; 
    myself.prototype = new parent(); 
    myself.prototype.constructor = myself; 
} 

function parent() { 
    this.d = ""; 
    this.e = []; 
    this.f = {}; 
    parent.prototype = new grandParent(); 
    parent.prototype.constructor = parent; 
} 

function grandParent() { 
    this.a = ""; 
    this.b = []; 
    this.c = {}; 
} 

var data = new myself(); 
var jsonData = {}; 
do { 
    for(var key in data) { 
     if(data.hasOwnProperty(key) && data.propertyIsEnumerable(key)) { 
      jsonData[key] = data[key]; 
     } 
    } 
    data = Object.getPrototypeOf(data).constructor.prototype; 
    Object.defineProperties(data, { 
     'constructor': { 
      enumerable: false 
     } 
    }); 
} while (data.constructor.name !== "grandParent") 
console.log(jsonData); 
Verwandte Themen