如何在JavaScript中迭代Object原型的属性?

时间:2011-10-28 20:04:14

标签: javascript constructor prototype-programming

如果我有一个虚拟构造函数对象:

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

此对象的实例将具有单个“radius”属性。 a)如何查询构造函数对象的属性数量?

b)我如何查询Circle.prototype它拥有的属性数量?尝试console.log(Object.getOwnPropertyNames(Circle.prototype))之类的东西不会返回任何内容

2 个答案:

答案 0 :(得分:1)

hasOwnProperty

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

j == 1; // true

答案 1 :(得分:1)

你有几个术语错误。

  1. 您不“查询构造函数对象”。您可以枚举实际对象的属性,但不能枚举构造函数。
  2. 您在代码示例中创建属性的方式是,您没有使用对象的prototype,所以如果您要迭代对象的原型,则不会看到radius属性。
  3. 假设你真正要说的是:“我如何迭代我的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.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