javascript - 如何在 JavaScript 中迭代对象原型(prototype)的属性?

标签 javascript constructor prototype-programming

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

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

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

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

最佳答案

您有几个术语错误。

  1. 您不“查询构造函数对象”。您可以枚举实际对象的属性,但不能枚举构造函数。
  2. 在代码示例中创建属性的方式,您没有使用对象的原型(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/

相关文章:

Javascript在数组中使用构造函数

javascript - 我无法在 javascript 中扩展 String 原型(prototype)

javascript - 如何访问构造函数变量?

javascript - 将字体大小与 iframe 大小成比例

javascript - 不使用 GET 将值传递到 iframe

java - 尝试创建一个带有 2D vector 和字符串数组头的 JTable,我该怎么做?

javascript - ES6 构造函数对象参数默认值

JavaScript 原型(prototype)困惑

javascript - NightmareJS 脚本永远不会返回?

javascript - 是否可以在重新加载后立即执行函数...?