#javascript #constructor #prototype-programming
#javascript #конструктор #прототип-программирование
Вопрос:
Если у меня есть фиктивный объект конструктора:
function Circle()
{
this.radius = 3;
}
Экземпляр этого объекта будет иметь единственное свойство «radius». а) Как мне запросить у объекта-конструктора количество свойств, которыми он обладает?
б) Как мне запросить Circle.prototype
количество свойств, которые у него есть? Попытка сделать что-то вроде console.log(Object.getOwnPropertyNames(Circle.prototype))
ничего не возвращает
Ответ №1:
У вас несколько неправильных терминов.
- Вы не «запрашиваете объект конструктора». Вы можете перечислять свойства фактического объекта, но не функцию конструктора.
- При создании свойств в вашем примере кода вы не используете свойства объекта
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.@ jfriend00 Спасибо, я думаю, меня смущает, в чем разница между функцией конструктора и прототипом объекта:
function Circle()
{
this.radius = 3;
}
var cir = new Circle();
console.log(cir.prototype); // returns undefined??
2. Я добавил больше к своему ответу, чтобы показать некоторые примеры использования фактического прототипа.
Ответ №2:
var cir = new Circle();
var j = 0;
for(var i in cir) {
if (cir.hasOwnProperty(i)) {
j ;
}
}
j == 1; // true