【问题标题】:Retrieving a value held in all instances of an object检索对象的所有实例中保存的值
【发布时间】:2016-01-24 06:45:09
【问题描述】:

我正在研究一个以姓名和年龄作为参数的 Person 构造函数,并尝试实现一个检索所有“Person”实例当前年龄值并输出平均值的方法。这是我的代码...

var Person = (function() {
    //private state
    var inst = 1;

    function Person(name, age) {
            this.name = name;
            this.age = age;
            Object.defineProperty(this, "age", {
                get: function() {
                    return age;
                },
                set: function(num) {
                    age = num;
                }
            });
            Object.defineProperty(this, "_id", {
                value: inst++
            });
        }

    //Attempt to return number of instances divided by all current Person weights
    Person.prototype.aveAge = function() {

        return inst;
    };
    return Person;
}());

var jim = new Person("jim", 32);
var richard = new Person("richard", 27);
richard.age = 28;
var alfie = new Person("alfie", 42);
Person.aveAge()  //Returns TypeError: Person.aveAge is not a function 

我设置了一个变量,该变量在所有实例(inst)之间共享,每次创建另一个实例时都会递增并分配一个唯一的 id。我无法弄清楚如何使用我在底部添加的 aveAge 原型来获取现有的所有 Person 实例的每个“年龄”值。当我尝试调用它以测试变量“inst”是否包含正确数量的实例时,我也会收到“TypeError:Person.aveAge 不是函数”。有人知道我哪里出错了吗?

【问题讨论】:

  • 首先Person.aveAge()不在原型上,而是在构造函数本身上,所以Person.prototype.aveAge = 应该是Person.aveAge = 。其次,您不需要使用 get/set,并且会影响您手动设置的道具。
  • aveAge() 是您的 Person 对象的方法,例如 jim.aveAge()
  • 可能更像这样 -> jsfiddle.net/apgk6mhL
  • 感谢大家的建议 - 似乎我有点困惑。非常感谢小提琴和代码 sn-ps 中的视觉效果。

标签: javascript oop constructor closures iife


【解决方案1】:

当它提到人时,保留一个人的年龄感觉很奇怪。请注意,将东西挂在__proto__ 上使它们可以从构造函数(Person)中使用,而将东西挂在prototype 上使它们可以从实例(理查德)中使用。如果更新了 Age,则需要通过 setAge 完成,这样 PeopleTracker 才知道更新它的内存。此外,在我的示例中,仅在需要时才计算平均值,而不是每次人们想知道是什么时。

        var peopleTracker = {
            _count: 0,
            _ages: [],
            averageAge: 0,
            addPerson: function (age) {
                var pt = peopleTracker;

                pt._count += 1;
                pt._ages.push(age);
                pt.getAverage();
            },
            getAverage: function () {
                var sum = 0,
                    pt = peopleTracker;

                sum = pt._ages.reduce(function (a, b) {
                    return a + b;
                });

                pt.averageAge = Math.round(sum / pt._count);
            },
            update: function (oldAge, newAge) {
                var pt = peopleTracker,
                    ages = pt._ages,
                    i = ages.indexOf(oldAge);

                ages.splice(i, 1, newAge);
                pt.getAverage();
            }
        };

        var Person = function (name, age) {
            this.name = name;
            this.age = age;
            peopleTracker.addPerson(age);
        };

        Person.__proto__ = { // available from the constructor
            Constructor: Person,
            setAge: function (age) {
                var oldAge = this.age;
                this.age = age;
                peopleTracker.update(oldAge, age);
            },
            aveAge: function () {
                return peopleTracker.averageAge;
            }
        };

        Person.prototype = Person.__proto__; // now also available from the instance

        var jim = new Person("Jim", 32),
            richard = new Person("Richard", 27),
            alfie = new Person("Alfie", 42);

        Person.aveAge();  // 34
        richard.aveAge(); // 34
        richard.setAge(20);
        Person.aveAge();  // 31
        richard.aveAge(); // 31

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多