如果我有一个虚拟构造对象:如何迭代JavaScript中对象原型的属性?
function Circle()
{
this.radius = 3;
}
该对象的实例将有单一的“半径”属性。 a)如何查询构造函数对象的属性数量?
b)如何查询Circle.prototype
它的属性数量?试图像console.log(Object.getOwnPropertyNames(Circle.prototype))
不返回任何
如果我有一个虚拟构造对象:如何迭代JavaScript中对象原型的属性?
function Circle()
{
this.radius = 3;
}
该对象的实例将有单一的“半径”属性。 a)如何查询构造函数对象的属性数量?
b)如何查询Circle.prototype
它的属性数量?试图像console.log(Object.getOwnPropertyNames(Circle.prototype))
不返回任何
你有几个术语事情是错误的。
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
@ jfriend00谢谢你,我想在那里我感到困惑的是什么构造函数和对象的原型之间的区别: '函数圈()'' {'' = this.radius 3;' '}' 'var cir = new Circle();' 'console.log(cir.prototype); //返回undefined ??' – user1019031
我在回答中添加了更多内容,以显示实际原型的一些示例用途。 – jfriend00
@ user1019031:请记住标记您接受的答案... – Alex
var cir = new Circle();
var j = 0;
for(var i in cir) {
if (cir.hasOwnProperty(i)) {
j++;
}
}
j == 1; // true
这不是原型。 – SLaks