Как перебрать свойства прототипа объекта в JavaScript? - PullRequest
0 голосов
/ 29 октября 2011

Если у меня есть фиктивный объект конструктора:

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

Экземпляр этого объекта будет иметь единственное свойство radius.a) Как я могу запросить объект конструктора о количестве свойств, которые у него есть?

b) Как бы я запросил Circle.prototype о количестве имеющихся у него свойств?Попытка что-то вроде console.log(Object.getOwnPropertyNames(Circle.prototype)) ничего не возвращает

Ответы [ 2 ]

1 голос
/ 29 октября 2011

У вас несколько неправильных терминологических понятий.

  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
1 голос
/ 29 октября 2011

hasOwnProperty

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

j == 1; // true
...