2011-10-28 48 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