如果我有一个虚拟构造函数对象:
function Circle()
{
this.radius = 3;
}
该对象的实例将具有单个“半径”属性。 a) 如何查询构造函数对象的属性数量?
b) 我如何查询Circle.prototype 的属性数量?尝试类似 console.log(Object.getOwnPropertyNames(Circle.prototype))
不会返回任何内容
最佳答案
您有几个术语错误。
- 您不“查询构造函数对象”。您可以枚举实际对象的属性,但不能枚举构造函数。
- 在代码示例中创建属性的方式,您没有使用对象的
原型(prototype)
,因此如果您要迭代对象的原型(prototype),您将看不到半径
> 属性(property)。
假设您真正想说的是:“如何迭代 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
}
}
对象的原型(prototype)是另一回事。您可以将其视为对象的每个新实例自动继承的结构。您可以像这样使用原型(prototype):
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
您还可以向您没有代码的现有对象(例如数组)的原型(prototype)添加方法(尽管执行此操作时必须小心)。例如:
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
关于javascript - 如何在 JavaScript 中迭代对象原型(prototype)的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7934305/