在Javascript中,有没有办法计算我创建了多少个已创建的对象?

时间:2016-05-12 10:32:25

标签: javascript variables object counting

例如,我们说我真的很饿,所以我一直在做煎饼!

var Buttermilk = new Pancake("Buttermilk", "Delicious");
var ChocolateChip = new Pancake("Chocolate Chip", "Amazing");
var BlueBerry = new Pancake("Blue Berry", "The Best");
var SnozBerry = new Pancake("Snoz Berry", "What's a Snoz Berry?");

我如何计算我刚制作的煎饼数量而不用手动制作?是否有代码表示"有很多变量属于Pancake品种"?

编辑:

谢谢你的答案!我特意寻找一种简单的方法来快速计算用少量代码创建对象的次数。这就是我得到的,谢谢!

6 个答案:

答案 0 :(得分:3)

您可以在javascript类中拥有静态属性。你可以用封闭方式将它们隐藏起来:

var Pancake = (function() {
    var instances = 0;
    return function(a, b) {
       this.a = a;
       this.b = b;
       instances++;

       Pancake.prototype.instances = function() { // equivalent of a static method
           return instances;
       }
    };
}());

或将它们放在对象原型中:

var pancake = function(a, b) {
    this.a = a;
    this.b = b;
    pancake.prototype.count = pancake.prototype.count ? pancake.prototype.count + 1 : 1; // equivalent of a static property
}

你也可以通过实现某种“继承”来“覆盖”构造函数,例如在这个小提琴中:

var Pancake = function(a, b) {
	this.a = a;
  this.b = b;
};

var before = Pancake.prototype;
var Pancake = function() {
	console.log("overriden");
	Pancake.prototype.instances = Pancake.prototype.instances ? Pancake.prototype.instances + 1 : 1; // here you should restore the whole prototype
  return before.constructor.apply(this, arguments);
};


var a = new Pancake("a", "b");
document.write(Pancake.prototype.instances + "<br />");
var b = new Pancake("c", "d");
document.write(Pancake.prototype.instances + "<br />");

document.write(JSON.stringify(a) + "<br />");
document.write(JSON.stringify(b) + "<br />");

答案 1 :(得分:2)

你可以保留一个在构造函数中会增加的计数器,这是一个很好的解决方案

How can I count the instances of an object?

答案 2 :(得分:1)

在Pancake函数中使用计数器变量..:)

var count = 0;
function Pancake(){
// Cook pancakes
count += 1;
}

console.log('Total pancakes' + count);

答案 3 :(得分:0)

我意识到你已经接受了答案,但这花了我一段时间!从你的问题我想你可能不想改变Pancake课程。所以这是试图避免这种情况。

此函数将搜索您指定的对象中的所有对象,并计算您的类型的所有实例。

<ion-card-header class="cardHead" text-center>
    <h2 class="cardHeaderText">{{obj.products.title}}</h2>

      <p>Prix: {{obj.price_html}}</p>
</ion-card-header>

<ion-card-content>
    <img src="{{obj.images.src}}">
    <p class="cardBodyText">{{obj.description}}</p>
    <p>Tags: {{obj.tags}}</p>
    <p>Catégories: {{obj.categories}}</p>
</ion-card-content>

我确信有些情况会失败,所以反馈意见得到赞赏!

答案 4 :(得分:0)

如果要计算从原型创建的实例数,则需要以下属性:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = TestConfig.class)
    class Test {
        @Autowired
        ClassA obj1; // how to initialise it with instance1

        @Autowired
        ClassA obj2; //// how to initialise it with instance2
    }

现在,在构造函数本身中使用:

Asset.prototype.index = 0;

答案 5 :(得分:0)

更面向对象的方法是使用静态方法和静态属性。 虽然 JS 没有静态属性,但我们可以在构造函数本身上设置它 例如

class Pancake {
    static count() {
        Pancake.counter = (Pancake.counter || 0) + 1;
        return;
    }
    constructor(objName) {
        Pancake.count();
        this.name = objName;
    }
}


new Pancake("A");
console.log(Pancake.counter);  //1
new Pancake("B");
console.log(Pancake.counter);  //2
new Pancake("C");
console.log(Pancake.counter);  //3
new Pancake("D");
console.log(Pancake.counter);  //4
new Pancake("E");
console.log(Pancake.counter);  //5

演示:https://jsfiddle.net/mux2qnsc/