2016-05-12 4 views
2

Например, скажем, я действительно голоден, поэтому я просто делаю блины!В Javascript есть способ подсчитать, сколько созданных объектов я создал?

Как я мог бы подсчитать, сколько блинов я сделал без ручного выполнения? Есть ли код, который говорит: «Есть много переменных, которые относятся к разнообразию блинчиков»?

EDIT:

Спасибо за ответы! Я специально искал простой способ быстро подсчитать количество раз, когда я создал объект с небольшим количеством кода. И это то, что я получил, спасибо!

+0

Вы не могли бы внести ваш отзыв? –

+1

Уверен, что вам придется делать это вручную ... – James

+0

Возможный дубликат [Как я могу подсчитать экземпляры объекта?] (Http://stackoverflow.com/questions/12378909/how-can-i-count -the-instance-of-the-object) –

ответ

2

You может иметь статические свойства в 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) { 
 
\t this.a = a; 
 
    this.b = b; 
 
}; 
 

 
var before = Pancake.prototype; 
 
var Pancake = function() { 
 
\t console.log("overriden"); 
 
\t 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 />");

+0

Большое вам спасибо! Вау, я не могу поверить, что я этого не делал! Я полностью забыл, что это функции, а не только объекты! – Raymond

+1

@ Раймонд Думал, что вы не хотели бы создавать его вручную! Вот что говорит ваш вопрос !? –

+0

@NidhinDavid Ах, вручную я имел в виду каждый раз, когда создаю новый экземпляр объекта, который мне нравится, добавляю к чему-то. поэтому после каждого нового блинчика я добавлю 1 к счету или что-то еще. Я не понимал, что могу просто поместить небольшую часть кода (я буквально просто поместил count ++) в функцию, и он будет добавлять каждый раз, когда я создавал новый экземпляр. – Raymond

1

Используйте переменную счетчика внутри функции Масленицы .. :)

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

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

'без ручного выполнения' –

+0

Спасибо! Я получил суть этого, очень простой легкий ответ! Спасибо! – Raymond

+0

добро пожаловать! – Vinay

2

Вы можете держать счетчик, который получит приращение в конструкторе, здесь является хорошим решением

How can I count the instances of an object?

+1

А это помогло! Я не самый лучший при кодировании, поэтому особенности и примеры немного меня смущают (почему я использовал блины в качестве примера) Спасибо, хотя! – Raymond

0

Я понимаю, что вы уже приняли ответ, но это заняло у меня время! Из вашего вопроса я думал, что вы, возможно, не захотите изменить класс «Блины». Итак, вот попытка избежать этого.

Эта функция будет искать все объекты в указанном вами объекте и подсчитывать все экземпляры вашего типа.

// Usage: 
    searchObjectForType(window, Pancake); // returns a number. 

    function searchObjectForType(obj,type){ 
     // Keep track of objects in stack so we don't overflow by searching into the same objects; 
     var stackObjs = []; 

     function recursiveProbe(obj){ 
      var foundCount = 0; 
      var objType; 
      // Some types will throw (iframes/nulls/..) 
      try{ 
      objType = obj.toString(); 
      } 
      catch(err){ 
      return 0; 
      } 
      // Skip document/previous objects as we know they won't have any. 
      if(typeof obj === "string" || stackObjs.indexOf(objType)>=0 || obj===document){ 
      return 0; 
      } 
      else{ 
      stackObjs.push(objType); 
      } 

      for (var i in obj){ 
      var prop = obj[i]; 
      if(prop instanceof type){ 
       foundCount++; 
      } 
      else{ 
       foundCount += recursiveProbe(prop); 
      } 
      } 
      // Remove this type from stackObjs so we can search future types. 
      stackObjs.splice(stackObjs.indexOf(obj.toString()),1); 
      return foundCount; 
     } 

     return recursiveProbe(obj); 
    }    

Уверен, что есть случаи, когда это не удается, поэтому отзывы оцениваются!