2013-09-24 52 views
6

Tôi có một số mã:Làm thế nào để lặp qua các thuộc tính nguyên mẫu của một đối tượng

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

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

gì làm tôi ngạc nhiên là tất cả những gì được đăng nhập là foo. Tôi dự kiến ​​vòng lặp for lặp lại qua các thuộc tính của mẫu thử nghiệm của obj (cụ thể là bar), bởi vì tôi đã không kiểm tra hasOwnProperty. Tôi đang thiếu gì ở đây? Và có một cách thành ngữ để lặp qua tất cả các thuộc tính trong nguyên mẫu không?

Tôi đã thử nghiệm điều này trong Chrome và IE10.

Xin cảm ơn trước.

+1

gắn các thuộc tính vào nguyên mẫu làm cho nó trở thành các thuộc tính của đối tượng đó chứ không phải đối tượng. –

Trả lời

6

Bạn đang lặp lại các thuộc tính của hàm tạo, bạn phải tạo một cá thể. Các ví dụ là những gì được thừa hưởng từ bất động sản prototype của constructor:

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! Cảm ơn bạn. – gwg

0

Nếu bạn muốn duy trì một hệ thống phân cấp thừa kế bằng cách định nghĩa tất cả các thuộc tính ngay cả trước khi đối tượng instantiation, bạn có thể làm theo các cách tiếp cận dưới đây. Cách tiếp cận này in chuỗi phân cấp nguyên mẫu.

Lưu ý: Trong phương pháp này, bạn không phải tạo hàm tạo ban đầu.

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); 
Các vấn đề liên quan