2011-10-28 84 views
0

如果我有一個虛擬構造對象:如何迭代JavaScript中對象原型的屬性?

function Circle() 
{ 
    this.radius = 3; 
} 

該對象的實例將有單一的「半徑」屬性。 a)如何查詢構造函數對象的屬性數量?

b)如何查詢Circle.prototype它的屬性數量?試圖像console.log(Object.getOwnPropertyNames(Circle.prototype))不返回任何

+3

這不是原型。 – SLaks

回答

1

你有幾個術語事情是錯誤的。

  1. 你不「查詢構造函數對象」。您可以枚舉實際對象的屬性,但不能枚舉構造函數。
  2. 您在代碼示例中創建屬性的方式,您沒有使用對象的prototype,因此如果要迭代對象的原型,則不會看到radius屬性。

假設你的真正用意是什麼要說的是:「我如何遍歷我Circle對象的一個​​實例的屬性?」,答案應該是這樣的:

function Circle() 
{ 
    this.radius = 3; 
    this.border = 1; 
    this.color = "red"; 
} 

var obj = new Circle(); 
for (var i in obj) { 
    // hasOwnProperty makes sure we get properties only of Circle, 
    // not of ancestors like Object 
    if (obj.hasOwnProperty(i)) { 
     // i will be properties of obj on each iteration 
     console.log(i);  // radius, border, color 
    } 
} 

的原型一個物體是不同的東西。你可以把它想象成一個結構,對象的每個新實例都會自動繼承。您可以使用這樣的原型:

function Circle(r) 
{ 
    this.radius = r; 
    this.border = 1; 
    this.color = "red"; 
} 

Circle.prototype.calcArea = function() { 
    return(Math.PI * this.radius * this.radius); 
} 

Circle.prototype.calcCircumference = function() { 
    return(Math.PI * this.radius * 2); 
} 

這會自動給出Circle的每個實例,兩個方法calcArea和calcCircumference。

var cir = new Circle(4); 
console.log(cir.calcArea()); // 54.624 

您還可以添加方法,以預先存在的對象的原型,你沒有的代碼,如Array(雖然你這樣做時要小心)。例如:

Array.prototype.isSorted = function() { 
    for (var i = 1; i < this.length; i++) { 
     if (this[i] < this[i-1]) { 
      return(false); 
     } 
    } 
    return(true); 
} 

var x = [1,3,6,8]; 
var y = [1,3,8,6]; 

console.log(x.isSorted()); // true 
console.log(y.isSorted()); // false 
+0

@ jfriend00謝謝你,我想在那裏我感到困惑的是什麼構造函數和對象的原型之間的區別: '函數圈()'' {'' = this.radius 3;' '}' 'var cir = new Circle();' 'console.log(cir.prototype); //返回undefined ??' – user1019031

+0

我在回答中添加了更多內容,以顯示實際原型的一些示例用途。 – jfriend00

+0

@ user1019031:請記住標記您接受的答案... – Alex

1

hasOwnProperty

var cir = new Circle(); 
var j = 0; 
for(var i in cir) { 
    if (cir.hasOwnProperty(i)) { 
     j++; 
    } 
} 

j == 1; // true